Contents

  1. 1. Quality Control
    1. 1.1 Fragement length distribution
    2. 1.2 PCA analysis and similarity heatmap
  2. 2. Differential Accessibility analysis
    1. 2.1 Tables
    2. 2.2 Volcano plots
    3. 2.3 Heatmaps
  3. 3. GO enrichment analysis
  4. 4. Omics Integration
  5. 5. Motif matching and footprinting
    1. 5.1 Motif analysis
    2. 5.2 footprinting

1. Quality Control

1.1 Fragment length distribution

None

1.2 PCA and similarity heatmap

PCA and similarity heatmap

Meta.Data

2. Differential accessibility analysis

2.1 Tables

Promoter

All

2.2 Volcano Plots

Combined

2.3 Heatmaps

2.3 Heatmaps

By p-value

By log2FoldChange

3. GO enrichment analysis

All gene sets derived from Gene Ontology Database.

GO BP

GO MF

GO CC

Reactome

Transcription_Factors

C2 gene sets

Gene sets in this collection are curated from various sources, including online pathway databases and the biomedical literature. Many sets are also contributed by individual domain experts. The gene set page for each gene set lists its source. The C2 collection is divided into the following two sub-collections: Chemical and genetic perturbations (CGP) and Canonical pathways (CP).

Hallmark gene sets

4. Omics Integration

4.1 ATAC vs. Transcriptomics

Tower Plot: Differential accessibility of top 25 up- and down-regulated genes

Correlation Plot

Significant differential accessibility

Significant differential expression

Both significant

5. Motif matching and footprinting

5.1 Motif-based analysis

Table
One-sided Volcano of enriched motifs

A = number of input regions with at least 1 occurrence of that particular transcription factor. B = number of input regions with no occurrence of that particular transcription factor. C = number of random background regions with at least 1 occurrence of that particular transcription factor. D = number of random background regions with no occurrence of that particular transcription factor. Here: foreground frequency ist (A/(A+B)), background frequency is (C/(C+D))

5.2 Footprinting

Summary

Combined

Activity Plot

Activity plot showing the distribution of z-transformend activity scores of the underlying motifs (y-axis) as computed by HINT-ATAC. On the x-axis the points are distributed randomly using the base R sample function with replace=T and setting seed=123. Motifs with differential footprinting (p-Value <=0.05 and |z-Score| >= 1) are highlighted in red (enriched in KO) or in blue (enriched in WT).

Volcano-Like Plot (Z-score vs. Adjusted p-Value)

Volcano plot showing the relationship between z-transformed activity scores as computed by HINT-ATAC and the corresponding p-values. Motifs with differential footprinting (p-Value <= 0.05 and |z-Score| >= 1) are highlighted in red (enriched in KO) or in blue (enrichedin WT).

Volcano-Like Plot (log2FC of Protection Score vs. Adjusted p-Value)

Volcano plot showing the relationship between log2 fold change of protection score (WT vs. KO) and the corresponding p-values. Motifs with top differential footprinting (p-Value <= 0.05 and |l2fc| >= .1) are highlighted in red (enriched in KO) or in blue (enrichedin WT).

Volcano-Like Plot (log2FC of Tag Counts vs. Adjusted p-Value)

Volcano plot showing the relationship between log2 fold change of tag counts (WT vs. KO) and the corresponding p-values. Motifs with top differential footprinting (p-Value <= 0.05 and |l2fc| >= .1) are highlighted in red (enriched in KO) or in blue (enrichedin WT).

LinePlots (AP-1 subunits)

MA0099.3.FOS::JUN (0.88)

MA0105.4.NFKB1 (0.75)

MA0137.3.STAT1 (0.55)

MA0462.2.BATF::JUN (0.69)

MA0476.1.FOS (0.23)

MA0477.2.FOSL1 (0.62)

MA0478.1.FOSL2 (0.91)

MA0488.1.JUN (0.08) +

MA0489.1.JUN_var.2 (0.72)

MA0490.2.JUNB (0.02) *

MA0491.2.JUND (0.03) *

MA0492.1.JUND_var.2 (0.04) *

MA0517.1.STAT1::STAT2 (0.11)

MA0778.1.NFKB2 (0.42)

MA1126.1.FOS::JUN_var.2 (0.04) *

MA1127.1.FOSB::JUN (0.02) *

MA1128.1.FOSL1::JUN (0.09) +

MA1129.1.FOSL1::JUN_var.2 (0.01) **

MA1130.1.FOSL2::JUN (0.88)

MA1131.1.FOSL2::JUN_var.2 (0.08) +

MA1132.1.JUN::JUNB (0.73)

MA1133.1.JUN::JUNB_var.2 (0.06) +

MA1134.1.FOS::JUNB (0.84)

MA1135.1.FOSB::JUNB (0.63)

MA1136.1.FOSB::JUNB_var.2 (0.006) ***

MA1137.1.FOSL1::JUNB (0.29)

MA1138.1.FOSL2::JUNB (0.29)

MA1139.1.FOSL2::JUNB_var.2 (0.01) **

MA1140.2.JUNB_var.2 (0.49)

MA1141.1.FOS::JUND (0.38)

MA1142.1.FOSL1::JUND (0.01) **

MA1143.1.FOSL1::JUND_var.2 (0.01) **

MA1145.1.FOSL2::JUND_var.2 (0.02) *

LinePlots (differentially binding TF)

MA0050.2.IRF1 (0) ***

MA0060.3.NFYA (0) **

MA0079.4.SP1 (0.01) *

MA0464.2.BHLHE40 (0.02) *

MA0490.2.JUNB (0.02) *

MA0491.2.JUND (0.03) *

MA0502.2.NFYB (0) ***

MA0516.2.SP2 (0.01) *

MA0604.1.Atf1 (0.02) *

MA0609.2.CREM (0.04) *

MA0638.1.CREB3 (0.03) *

MA0685.1.SP4 (0) **

MA0740.1.KLF14 (0) **

MA0746.2.SP3 (0.02) *

MA0755.1.CUX2 (0.01) **

MA0834.1.ATF7 (0.04) *

MA0835.2.BATF3 (0.02) *

MA0837.1.CEBPE (0.02) *

MA0840.1.Creb5 (0.04) *

MA0844.1.XBP1 (0.01) **

MA0862.1.GMEB2 (0.01) **

MA0886.1.EMX2 (0.03) *

MA0888.1.EVX2 (0) ***

MA0893.2.GSX2 (0) **

MA0912.2.HOXD3 (0.03) *

MA1125.1.ZNF384 (0) **

MA1127.1.FOSB::JUN (0.02) *

MA1142.1.FOSL1::JUND (0.01) **

MA1557.1.SMAD5 (0.04) *

MA1560.1.SOHLH2 (0) ***

MA1564.1.SP9 (0.04) *

MA1632.1.ATF2 (0.03) *

MA1634.1.BATF (0) ***

MA1683.1.FOXA3 (0) ***

Author and session Information

Analyzed by

Dr. Ali T. Abdallah, Dipl. Inf.
Bioinformatics Facility (Coordinator)
University Hospital of Cologne - CECAD Research Center
Joseph-Stelzmann-Str. 26, 52074 Cologne, Germany
Phone +49 221 478 84017

Detailed Session Info


  1. CECAD Research Center - University of Cologne, ↩︎

LS0tCnRpdGxlOiAnQVRBQy1zZXEtYW5hbHlzaXM6IFJlcHJvZ3JhbW1pbmcgb2YgZmlicm9ibGFzdHMnCmF1dGhvcjoKICAtIG5hbWU6IEFsaSBULiBBYmRhbGxhaCBeW0NFQ0FEIFJlc2VhcmNoIENlbnRlciAtIFVuaXZlcnNpdHkgb2YgQ29sb2duZSwgYWxpLmFiZGFsbGFoQHJ3dGgtYWFjaGVuLmRlXQpmb250c2l6ZTogMTVwdApkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICB0b2M6IHllcwogIGhpZ2hsaWdodDoga2F0ZQogIHRoZW1lOiB5ZXRpCiAgY3NzOiAic3R5bGUvdGhlbWUuY3NzIgotLS0KCjxzdHlsZT4KLm1haW4tY29udGFpbmVyewogICAgbWluLXdpZHRoOiAxODAwcHg7IWltcG9ydGFudAogICAgbWFyZ2luLWxlZnQ6IGF1dG87IWltcG9ydGFudAogICAgbWFyZ2luLXJpZ2h0OiBhdXRvOyFpbXBvcnRhbnQKICAgIGZvbnQtc2l6ZTogMTVweDshaW1wb3J0YW50Cn0KCiN0b2NfY29udGFpbmVyIHsKICAgIGJhY2tncm91bmQ6ICNmOWY5Zjkgbm9uZSByZXBlYXQgc2Nyb2xsIDAgMDsKICAgIGJvcmRlcjogMHB4IHNvbGlkICNhYWE7CiAgICBkaXNwbGF5OiB0YWJsZTsKICAgIGZvbnQtc2l6ZTogMTAwJTsKICAgIG1hcmdpbi1ib3R0b206IDFlbTsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICB3aWR0aDogYXV0bzsKfQoKLnRvY190aXRsZSB7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKI3RvY19jb250YWluZXIgbGksICN0b2NfY29udGFpbmVyIG9sLCAjdG9jX2NvbnRhaW5lciBvbCBsaXsKICAgIGxpc3Qtc3R5bGU6IG91dHNpZGUgbm9uZSBub25lICFpbXBvcnRhbnQ7Cn0KCmgzewogIGNvbG9yOiAjODAwMDAwOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgpoNHsKICBjb2xvcjogIzAwMDA4MDsKICBmb250LXdlaWdodDogYm9sZDsKfQoKaDQgYXsKICBjb2xvcjogIzAwMDA4MDsKfQoKaDV7CiAgY29sb3I6ICMwMDgwODA7CiAgZm9udC13ZWlnaHQ6IGJvbGQKfQoKaDUgYXsKICBjb2xvcjogIzAwODA4MDsKfQoKPC9zdHlsZT4KCgo8ZGl2IGlkPSJ0b2NfY29udGFpbmVyIj4KPHAgY2xhc3M9InRvY190aXRsZSIgaWQ9ImJhY2siPjxoNCBzdHlsZT0iY29sb3I6IzgwMDAwMCI+PGI+Q29udGVudHM8L2I+PC9oND48L3A+CjxvbCBjbGFzcz0idG9jX2xpc3QiIHN0eWxlPSJmb250LXNpemU6MTVweCI+CiAgCiAgPGxpPjxhIGhyZWY9IiNRQyI+PGI+MS4gUXVhbGl0eSBDb250cm9sPC9iPjwvYT4KICAgICAgPG9sIGNsYXNzPSJ0b2NfbGlzdCI+CiAgICAgIDxsaT48YSBocmVmPSIjUUNmbGQiPjEuMSBGcmFnZW1lbnQgbGVuZ3RoIGRpc3RyaWJ1dGlvbiA8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9IiNRQ3BjYXNoIj4xLjIgUENBIGFuYWx5c2lzIGFuZCBzaW1pbGFyaXR5IGhlYXRtYXAgPC9hPjwvbGk+CiAgICA8L29sPgogIDwvbGk+CiAgCiAgPGxpPjxhIGhyZWY9IiNEQUEiPjxiPjIuIERpZmZlcmVudGlhbCBBY2Nlc3NpYmlsaXR5IGFuYWx5c2lzPC9iPjwvYT4gCiAgICA8b2wgY2xhc3M9InRvY19saXN0Ij4KICAgICAgPGxpPjxhIGhyZWY9IiNEQUF0Ij4yLjEgVGFibGVzPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjREFBdnAiPjIuMiBWb2xjYW5vIHBsb3RzPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjREFBaG0iPjIuMyBIZWF0bWFwczwvYT48L2xpPgogICAgPC9vbD4KICA8L2xpPgoKICA8bGk+PGEgaHJlZj0iI0dTRUEiPjxiPjMuIEdPIGVucmljaG1lbnQgYW5hbHlzaXMgPC9iPjwvYT4gIDwvbGk+CiAgCiAgPGxpPjxhIGhyZWY9IiNJbnRlZ3JhdGlvbiI+PGI+NC4gT21pY3MgSW50ZWdyYXRpb248L2I+PC9hPjwvbGk+CiAgCiAgPGxpPjxhIGhyZWY9IiNNb3RpZmFuYWx5c2lzRm9vdHByaW50aW5nIj48Yj41LiBNb3RpZiBtYXRjaGluZyBhbmQgZm9vdHByaW50aW5nIDwvYj48L2E+CiAgICAgIDxvbCBjbGFzcz0idG9jX2xpc3QiPgogICAgICA8bGk+PGEgaHJlZj0iI01vdGlmYW5hbHlzaXNGb290cHJpbnRpbmdtYSI+NS4xIE1vdGlmIGFuYWx5c2lzIDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iI01vdGlmYW5hbHlzaXNGb290cHJpbnRpbmdmcCI+NS4yIGZvb3RwcmludGluZyA8L2E+PC9saT4KICAgICAgPC9vbD4KICA8L2xpPgo8L29sPgo8L2Rpdj4KCgoKIyMgey50YWJzZXQgLnRhYnNldC1mYWRlfQoKCmBgYHtyIHNldHVwLCBlY2hvPUZ9CnNvdXJjZSgiLi9SL2Z1bmN0aW9ucy5SIikKc291cmNlKCIuL1IvTkdTVG9vbHMuUiIpCmxpYnJhcnkoVHhEYi5Ic2FwaWVucy5VQ1NDLmhnMzgua25vd25HZW5lKQpsaWJyYXJ5KHRhcmdldHMpCmxpYnJhcnkoZ2dwbG90MikKdHhkYiA8LSBUeERiLkhzYXBpZW5zLlVDU0MuaGczOC5rbm93bkdlbmUKdHhkYiR1c2VyX3NlcWxldmVscyA8LSBnc3ViKHBhdHRlcm49ImNociIsIHJlcGxhY2VtZW50ID0gIiIsIHR4ZGIkdXNlcl9zZXFsZXZlbHMpCnRhcl9tYWtlKCkKcHJpbnQoIiIpCmBgYAoKCjxoMyBpZD0iUUMiPjxhIGhyZWY9IiNiYWNrIj4gMS4gUXVhbGl0eSBDb250cm9sIDwvYT48L2gzPgoKPGg0IGlkPSJRQ2ZsZCI+IDxhIGhyZWY9IiNiYWNrIj4gMS4xIEZyYWdtZW50IGxlbmd0aCBkaXN0cmlidXRpb24gPC9hPjwvaDQ+Ck5vbmUKCjxoNCBpZD0iUUNwY2FzaCI+IDxhIGhyZWY9IiNiYWNrIj4gIDEuMiBQQ0EgYW5kIHNpbWlsYXJpdHkgaGVhdG1hcCA8L2E+PC9oND4KCiMjIyBQQ0EgYW5kIHNpbWlsYXJpdHkgaGVhdG1hcApgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9NSwgZWNobz1GfQpjb2xEYXRhIDwtIHRhcl9yZWFkKGNvbERhdGEpCgpwZGYoZmlsZSA9ICJwYXBlci9wbG90cy9wY2EuYW5kLnNpbWhtLnBkZiIsIHdpZHRoID0gMTIsIGhlaWdodCA9IDUpCmdncGxvdGlmeTo6YXMuZ2dwbG90KGNvd3Bsb3Q6OnBsb3RfZ3JpZCh0YXJfcmVhZChQQ0FfcGxvdCksIHRhcl9yZWFkKFNJTV9obSksIG5jb2w9MikpICsgIwogIGdndGl0bGUocGFzdGUodW5pcXVlKGNvbERhdGEkY29uZGl0aW9uKVsxXSwgIiB2cy4gIiwgdW5pcXVlKGNvbERhdGEkY29uZGl0aW9uKVsyXSwgc2VwPSIiKSkgKyAKICB0aGVtZShwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBoanVzdD0wLjUsIGNvbG91ciA9ICIjMDAwMDgwIikpCmRldi5vZmYoKQpgYGAKYGBge3IgZWNobz1GfQpkb3dubG9hZHRoaXM6OmRvd25sb2FkX2ZpbGUoCiAgcGF0aCA9IChwYXN0ZSgicGFwZXIvcGxvdHMvIixwY2FfcCwgc2VwPSIiKSksCiAgb3V0cHV0X25hbWUgPSBwY2FfcCwKICBidXR0b25fbGFiZWwgPSAiRG93bmxvYWQgcGRmIGZpbGUiLAogIGJ1dHRvbl90eXBlID0gInN1Y2Nlc3MiLAogIGhhc19pY29uID0gVFJVRSwKICBpY29uID0gImZhIGZhLXNhdmUiLAogIHNlbGZfY29udGFpbmVkID0gVAopCmBgYAoKIyMjIE1ldGEuRGF0YQpgYGB7ciBlY2hvPUZ9ClRhYmxlX3RpdGxlIDwtICJNZXRhZGF0YSBvZiBMeW4uS08gZXhwZXJpbWVudCIKdGFibGVfbmFtZSA8LSAiTHluLktvLk1ldGEuRGF0YSIKRFQ6OmRhdGF0YWJsZShjb2xEYXRhLCByb3duYW1lcyA9IFQsIGZpbHRlciA9ICd0b3AnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9IFRhYmxlX3RpdGxlLCBleHRlbnNpb25zID0gJ0J1dHRvbnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAnQmZydGlwJywgc2Nyb2xsWD1GLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBsaXN0KGxpc3QoZXh0ZW5kPSdjc3YnLCB0aXRsZT10YWJsZV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZXh0ZW5kPSdleGNlbCcsIGZpbGVuYW1lPXRhYmxlX25hbWUpLCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChleHRlbmQ9J3BkZicsIGZpbGVuYW1lPXRhYmxlX25hbWUpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9XaWR0aCA9IFRSVUUsIHBhZ2VMZW5ndGggPSAyMCkpCmBgYAoKIyMgey50YWJzZXQgLnRhYnNldC1mYWRlfQo8aDMgaWQ9IkRBQSI+PGEgaHJlZj0iI2JhY2siPjIuIERpZmZlcmVudGlhbCBhY2Nlc3NpYmlsaXR5IGFuYWx5c2lzIDwvYT48L2gzPgoKPGg0IGlkPSJEQUF0Ij48YSBocmVmPSIjYmFjayI+Mi4xIFRhYmxlczwvYT48L2g0PgoKIyMjIFByb21vdGVyCmBgYHtyIGVjaG89Riwgd2FybmluZz1GfQpUYWJsZV90aXRsZSA8LSAiVGFibGUgb2YgZGlmZmVyZW50aWFsbHkgYWNjZXNzaWJsZSBnZW5lcyAoYnkgaW50ZXJ2YWwgLSBwcm9tb3RlciByZWdpb24pIgp0YWJsZV9uYW1lIDwtICJEaWZmX2FjY2Vzc2libGVfZ2VuZXNfYnlfaW50ZXJ2YWxfcHJvbW90ZXIiCnNpZ24ucmVzdWx0cyA8LSB0YXJfcmVhZChzaWduLnJlc3VsdHMpCkRUOjpkYXRhdGFibGUoc2lnbi5yZXN1bHRzW3NpZ24ucmVzdWx0cyRyZWR1Y2VkLmFubm90YXRpb24gJWluJSBjKCJQcm9tb3RlciIpLCBdLCByb3duYW1lcyA9IEZBTFNFLCBmaWx0ZXIgPSAndG9wJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHRpb24gPSBUYWJsZV90aXRsZSwgZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QoZG9tID0gJ0JmcnRpcCcsIHNjcm9sbFg9RiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyA9IGxpc3QobGlzdChleHRlbmQ9J2NzdicsIHRpdGxlPXRhYmxlX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChleHRlbmQ9J2V4Y2VsJywgZmlsZW5hbWU9dGFibGVfbmFtZSksICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGV4dGVuZD0ncGRmJywgZmlsZW5hbWU9dGFibGVfbmFtZSkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1dpZHRoID0gVFJVRSwgcGFnZUxlbmd0aCA9IDIwKSkKCmBgYAoKIyMjIEFsbApgYGB7ciBlY2hvPUYsIHdhcm5pbmc9Rn0KVGFibGVfdGl0bGUgPC0gIlRhYmxlIG9mIGRpZmZlcmVudGlhbGx5IGFjY2Vzc2libGUgZ2VuZXMgKGJ5IGludGVydmFsKSIKdGFibGVfbmFtZSA8LSAiRGlmZl9hY2Nlc3NpYmxlX2dlbmVzX2J5X2ludGVydmFsIgpEVDo6ZGF0YXRhYmxlKHNpZ24ucmVzdWx0cywgcm93bmFtZXMgPSBGQUxTRSwgZmlsdGVyID0gJ3RvcCcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0aW9uID0gVGFibGVfdGl0bGUsIGV4dGVuc2lvbnMgPSAnQnV0dG9ucycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KGRvbSA9ICdCZnJ0aXAnLCBzY3JvbGxYPUYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyA9IGxpc3QobGlzdChleHRlbmQ9J2NzdicsIHRpdGxlPXRhYmxlX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChleHRlbmQ9J2V4Y2VsJywgZmlsZW5hbWU9dGFibGVfbmFtZSksICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGV4dGVuZD0ncGRmJywgZmlsZW5hbWU9dGFibGVfbmFtZSkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1dpZHRoID0gVFJVRSwgcGFnZUxlbmd0aCA9IDIwKSkKCgoKCmBgYAoKYGBge3IgZWNobz1GfQpnZW5lcmF0ZV9tb3RpZl9kYXRhZnJhbWVfYmVkIDwtIGZ1bmN0aW9uKGFubm90YXRlZFBlYWtzLmRmLCByZXN1bHRzKXsKICBzciA8LSByZXN1bHRzICU+JSBkcGx5cjo6ZmlsdGVyKEdlbmVpZCAlaW4lIGFubm90YXRlZFBlYWtzLmRmJEdlbmVpZCkgJT4lICBkcGx5cjo6c2VsZWN0KEdlbmVpZCwgU3ltYm9sLCBsb2cyRm9sZENoYW5nZSwgcGFkaikgJT4lIG5hLm9taXQoKQogIG1vdGlmLmJlZC5maWxlIDwtIGFubm90YXRlZFBlYWtzLmRmICU+JSAKICAgICAgICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKEdlbmVpZCAlaW4lIHJlc3VsdHMkR2VuZWlkKSAlPiUgIAogICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3Qoc2VxbmFtZXMsIHN0YXJ0LCBlbmQsIEdlbmVpZCwgU3ltYm9sKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgbmEub21pdCgpICU+JSAKICAgICAgICAgICAgICAgICAgICBtZXJnZShzciwgYnk9YygiR2VuZWlkIiwgIlN5bWJvbCIpKSAlPiUKICAgICAgICAgICAgICAgICAgICByZWxvY2F0ZShHZW5laWQsIFN5bWJvbCwgLmFmdGVyPWVuZCkgJT4lIAogICAgICAgICAgICAgICAgICAgIGFycmFuZ2Uoc2VxbmFtZXMsIHN0YXJ0LCBlbmQpIAogIHJldHVybihtb3RpZi5iZWQuZmlsZSkKfQoKZDEgPC0gZ2VuZXJhdGVfbW90aWZfZGF0YWZyYW1lX2JlZChhbm5vdGF0ZWRQZWFrcy5kZiA9IGFubm90YXRlZFBlYWtzLmRmLCByZXN1bHRzID0gc2lnbi5yZXN1bHRzKQoKdGFyZ2V0X2RpciA8LSAifi9EZXNrdG9wL0NIRU9QUy9wcm9qZWN0cy9jZWNhZC9iaW9pbmZvcm1hdGljcy1jb3JlLWZhY2lsaXR5L3Byb2plY3RzLzJfcHJpbWFyeS5hbmFseXNpcy9BR19IYWxsZWsveHh4eHh4X3ZvbXN0ZWluX2F0YWNzZXEvcmVzdWx0cy9id2EvbWVyZ2VkUmVwbGljYXRlL2luZGlyL21vdGlmLmFuYWx5c2lzLyIKcm9pIDwtIGdlbmVyYXRlX21vdGlmX2RhdGFmcmFtZV9iZWQoYW5ub3RhdGVkUGVha3MuZGYgPSBhbm5vdGF0ZWRQZWFrcy5kZiwgcmVzdWx0cyA9IHNpZ24ucmVzdWx0cykKYmcgPC0gZ2VuZXJhdGVfbW90aWZfZGF0YWZyYW1lX2JlZChhbm5vdGF0ZWRQZWFrcy5kZiA9IGFubm90YXRlZFBlYWtzLmRmLCByZXN1bHRzID0gcmVzdWx0cykKd3JpdGUudGFibGUocm9pLCBmaWxlPXBhc3RlKHRhcmdldF9kaXIsIi8iLCJyb2kuYmVkIiwgc2VwPSIiKSwgY29sLm5hbWVzID0gRiwgcm93Lm5hbWVzPUYsIHF1b3RlPUYsIHNlcD0iXHQiKQp3cml0ZS50YWJsZShiZywgZmlsZT1wYXN0ZSh0YXJnZXRfZGlyLCIvIiwiYmcuYmVkIiwgc2VwPSIiKSwgY29sLm5hbWVzID0gRiwgcm93Lm5hbWVzPUYsIHF1b3RlPUYsIHNlcD0iXHQiKQpgYGAKCgpgYGB7ciBlY2hvPUZ9CmlmKEYpewogIGdlbmVyYXRlX21vdGlmX2RhdGFmcmFtZV9iZWQgPC0gZnVuY3Rpb24oYW5ub3RhdGVkUGVha3MuZGYsIGRhcC5kZiwgc2VxLmNvbHVtLm5hbWU9InNlcW5hbWVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydC5jb2x1bW4ubmFtZT0ic3RhcnQiLCBlbmQuY29sdW1uLm5hbWU9ImVuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWFrLmNvbHVtbi5uYW1lPSJHZW5laWQiLCBnZW5lLmNvbHVtbi5uYW1lPSJTeW1ib2wiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwyZmMuY29sdW1uLm5hbWU9ImxvZzJGb2xkQ2hhbmdlIiwgcGFkai5jb2x1bW4ubmFtZT0icGFkaiIpewogICAgCiAgICBzciA8LSBkYXAuZGYgJT4lIAogICAgICAgICAgZHBseXI6OmZpbHRlcihnZXQocGVhay5jb2x1bW4ubmFtZSkgJWluJSBhbm5vdGF0ZWRQZWFrcy5kZlsscGVhay5jb2x1bW4ubmFtZV0pICU+JSAKICAgICAgICAgIGRwbHlyOjpzZWxlY3QocGVhay5jb2x1bW4ubmFtZSwgZ2VuZS5jb2x1bW4ubmFtZSwgbDJmYy5jb2x1bW4ubmFtZSwgcGFkai5jb2x1bW4ubmFtZSkgJT4lCiAgICAgICAgICBuYS5vbWl0KCkKICAgIG1vdGlmLmJlZC5maWxlIDwtIGFubm90YXRlZFBlYWtzLmRmICU+JSAKICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoZ2V0KHBlYWsuY29sdW1uLm5hbWUpICVpbiUgZGFwLmRmWyxwZWFrLmNvbHVtbi5uYW1lXSkgJT4lICAKICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3Qoc2VxLmNvbHVtLm5hbWUsIHN0YXJ0LmNvbHVtbi5uYW1lLCBlbmQuY29sdW1uLm5hbWUsIHBlYWsuY29sdW1uLm5hbWUsIGdlbmUuY29sdW1uLm5hbWUpICU+JSAKICAgICAgICAgICAgICAgICAgICAgIG5hLm9taXQoKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICBtZXJnZShzciwgYnk9YyhwZWFrLmNvbHVtbi5uYW1lLCBnZW5lLmNvbHVtbi5uYW1lKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0ZShwZWFrLmNvbHVtbi5uYW1lLCBnZW5lLmNvbHVtbi5uYW1lLCAuYWZ0ZXI9ZW5kLmNvbHVtbi5uYW1lKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICBhcnJhbmdlKGdldChzZXEuY29sdW0ubmFtZSksIGdldChzdGFydC5jb2x1bW4ubmFtZSksIGdldChlbmQuY29sdW1uLm5hbWUpICkKICAgIHJldHVybihtb3RpZi5iZWQuZmlsZSkKICB9CiAgCiBkMiA8LSAgZ2VuZXJhdGVfbW90aWZfZGF0YWZyYW1lX2JlZChhbm5vdGF0ZWRQZWFrcy5kZiA9IGFubm90YXRlZFBlYWtzLmRmLCBkYXAuZGYgPSBzaWduLnJlc3VsdHMpCiAgIAogIHRhcmdldF9kaXIgPC0gIn4vRGVza3RvcC9DSEVPUFMvcHJvamVjdHMvY2VjYWQvYmlvaW5mb3JtYXRpY3MtY29yZS1mYWNpbGl0eS9wcm9qZWN0cy8yX3ByaW1hcnkuYW5hbHlzaXMvQUdfSGFsbGVrL3h4eHh4eF92b21zdGVpbl9hdGFjc2VxL3Jlc3VsdHMvYndhL21lcmdlZFJlcGxpY2F0ZS9pbmRpci9tb3RpZi5hbmFseXNpcy8iCiAgcm9pIDwtIGdlbmVyYXRlX21vdGlmX2RhdGFmcmFtZV9iZWQoYW5ub3RhdGVkUGVha3MuZGYgPSBhbm5vdGF0ZWRQZWFrcy5kZiwgcmVzdWx0cyA9IHNpZ24ucmVzdWx0cykKICBiZyA8LSBnZW5lcmF0ZV9tb3RpZl9kYXRhZnJhbWVfYmVkKGFubm90YXRlZFBlYWtzLmRmID0gYW5ub3RhdGVkUGVha3MuZGYsIHJlc3VsdHMgPSByZXN1bHRzKQogIHdyaXRlLnRhYmxlKHJvaSwgZmlsZT1wYXN0ZSh0YXJnZXRfZGlyLCIvIiwicm9pLmJlZCIsIHNlcD0iIiksIGNvbC5uYW1lcyA9IEYsIHJvdy5uYW1lcz1GLCBxdW90ZT1GLCBzZXA9Ilx0IikKICB3cml0ZS50YWJsZShiZywgZmlsZT1wYXN0ZSh0YXJnZXRfZGlyLCIvIiwiYmcuYmVkIiwgc2VwPSIiKSwgY29sLm5hbWVzID0gRiwgcm93Lm5hbWVzPUYsIHF1b3RlPUYsIHNlcD0iXHQiKQp9CmBgYAoKIyMgey50YWJzZXQgLnRhYnNldC1mYWRlfQoKPGg0IGlkPSJEQUF2cCI+IDxhIGhyZWY9IiNiYWNrIj4yLjIgVm9sY2FubyBQbG90cyA8L2E+PC9oND4KCiMjIyBDb21iaW5lZApgYGB7ciBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MjEsIHdhcm5pbmc9RiwgZWNobz1GfQp2cGkgPC0gdGFyX3JlYWQoVlBJKQp2cHQgPC0gdGFyX3JlYWQoVlBUKQp2cGcgPC0gdGFyX3JlYWQoVlBHKQpnZ3Bsb3RpZnk6OmFzLmdncGxvdChwbG90X2dyaWQoZ2dwbG90KCkrdGhlbWVfdm9pZCgpLHBsb3RfZ3JpZCh2cGksIHZwdCwgbmNvbD0yKSwgcmVsX2hlaWdodHMgPSBjKDEsMjApLCBuY29sPTEpKSArIGdndGl0bGUoIlZvbGNhbm8gcGxvdHMgYXQgYm90aCBsZXZlbHMgKFBlYWssIFRyYW5zY3JpcHQpIiwgc3VidGl0bGUgPSAiRGlmZmVyZW50aWFsIGFjY2Vzc2liaWxpdHkgb2YgTHluLktPIHZzLiBMeW4uV1QgZnJvbSBBVEFDLVNlcSBkYXRhIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvdXIgPSAiIzAwMDA4MCIsIGhqdXN0ID0gMC41LCBzaXplPTE4KSwgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJwbGFpbiIsIGNvbG91ciA9ICJibGFjayIsIGhqdXN0ID0gMC41LCBzaXplPTEyKSkKCgpgYGAKCiMjIyBJbnRlcnZhbGwKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9Nywgd2FybmluZz1GLCBlY2hvPUZ9CnBkZihmaWxlID0gInBhcGVyL3Bsb3RzL3ZvbGNhbm8ucGxvdC5pbnRlcnZhbGwucGRmIiwgd2lkdGggPSA3LCBoZWlnaHQgPSA2KQp2cGkrIAogIGdndGl0bGUoIlZvbGNhbm8gcGxvdCBhdCBwZWFrIGxldmVsIiwgCiAgICAgICAgICBzdWJ0aXRsZSA9ICJEaWZmZXJlbnRpYWwgYWNjZXNzaWJpbGl0eSBvZiBMeW4uS08gdnMuIEx5bi5XVCBmcm9tIEFUQUMtU2VxIGRhdGEiKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPQogICAgICAgICAgZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCAKICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiIzAwMDA4MCIsIAogICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMC41LCBzaXplPTE4KSwgCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IAogICAgICAgICAgZWxlbWVudF90ZXh0KGZhY2U9InBsYWluIiwgCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgCiAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwLjUsIAogICAgICAgICAgICAgICAgICAgICAgIHNpemU9MTIpKQpkZXYub2ZmKCkKYGBgCmBgYHtyIGVjaG89Rn0KZG93bmxvYWR0aGlzOjpkb3dubG9hZF9maWxlKAogIHBhdGggPSAocGFzdGUoInBhcGVyL3Bsb3RzLyIsdnBpX3AsIHNlcD0iIikpLAogIG91dHB1dF9uYW1lID0gdnBpX3AsCiAgYnV0dG9uX2xhYmVsID0gIkRvd25sb2FkIHBkZiBmaWxlIiwKICBidXR0b25fdHlwZSA9ICJzdWNjZXNzIiwKICBoYXNfaWNvbiA9IFRSVUUsCiAgaWNvbiA9ICJmYSBmYS1zYXZlIiwKICBzZWxmX2NvbnRhaW5lZCA9IFQKKQpgYGAKCiMjIyBUcmFuc2NyaXB0CmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTcsIHdhcm5pbmc9RiwgZWNobz1GfQpwZGYoZmlsZSA9ICJwYXBlci9wbG90cy92b2xjYW5vLnBsb3QudHJhbnNjcmlwdC5wZGYiLCB3aWR0aCA9IDcsIGhlaWdodCA9IDYpCnZwdCsgCiAgZ2d0aXRsZSgiVm9sY2FubyBwbG90IGF0IHRyYW5zY3JpcHQgbGV2ZWwiLCAKICAgICAgICAgIHN1YnRpdGxlID0gIkRpZmZlcmVudGlhbCBhY2Nlc3NpYmlsaXR5IG9mIEx5bi5LTyB2cy4gTHluLldUIGZyb20gQVRBQy1TZXEgZGF0YSIpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9CiAgICAgICAgICBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIAogICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICIjMDAwMDgwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwLjUsIHNpemU9MTgpLCAKICAgICAgICBwbG90LnN1YnRpdGxlID0gCiAgICAgICAgICBlbGVtZW50X3RleHQoZmFjZT0icGxhaW4iLCAKICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCAKICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDAuNSwgCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT0xMikpCmRldi5vZmYoKQpgYGAKYGBge3IgZWNobz1GfQpkb3dubG9hZHRoaXM6OmRvd25sb2FkX2ZpbGUoCiAgcGF0aCA9IChwYXN0ZSgicGFwZXIvcGxvdHMvIix2cHRfcCwgc2VwPSIiKSksCiAgb3V0cHV0X25hbWUgPSB2cHRfcCwKICBidXR0b25fbGFiZWwgPSAiRG93bmxvYWQgcGRmIGZpbGUiLAogIGJ1dHRvbl90eXBlID0gInN1Y2Nlc3MiLAogIGhhc19pY29uID0gVFJVRSwKICBpY29uID0gImZhIGZhLXNhdmUiLAogIHNlbGZfY29udGFpbmVkID0gVAopCmBgYAoKIyMgey50YWJzZXQgLnRhYnNldC1mYWRlfQo8aDQ+Mi4zIEhlYXRtYXBzPC9oND4KCjxoNCBpZD0iREFBaG0iPiA8YSBocmVmPSIjYmFjayI+Mi4zIEhlYXRtYXBzIDwvYT48L2g0PgoKIyMjIEJ5IHAtdmFsdWUKYGBge3IgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9OCwgZWNobz1GLCB3YXJuaW5nPUZ9CnRhcl9yZWFkKCJITV9wYWRqIikKYGBgCgojIyMgQnkgbG9nMkZvbGRDaGFuZ2UKYGBge3IgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9OCwgZWNobz1GLCB3YXJuaW5nPUZ9CnRhcl9yZWFkKCJITV9sMmZjIikKYGBgCgoKIyMgey50YWJzZXQgLnRhYnNldC1mYWRlfQoKPGgzIGlkPSJHU0VBIj48YSBocmVmPSIjYmFjayI+My4gR08gZW5yaWNobWVudCBhbmFseXNpcyA8L2E+PC9oMz4KCkFsbCBnZW5lIHNldHMgZGVyaXZlZCBmcm9tIEdlbmUgT250b2xvZ3kgRGF0YWJhc2UuCmBgYHtyIGVjaG89Riwgd2FybmluZz1GfQpzb3VyY2UoIlIvZnVuY3Rpb25zLlIiKQpzb3VyY2UoIlIvaGVscGVyLlIiKQoKZmVfcmVzdWx0c191cCA8LSB0YXJfcmVhZCgiZmUucmVzdWx0cy51cCIpCmZlX3Jlc3VsdHNfZG4gPC0gdGFyX3JlYWQoImZlLnJlc3VsdHMuZG4iKQoKZmVfcmVzdWx0c19kbiRkaXJlY3Rpb24gPC0gIkRPV04iCmZlX3Jlc3VsdHNfdXAkZGlyZWN0aW9uIDwtICJVUCIgCmZlX3Jlc3VsdHMgPC0gcmJpbmQoZmVfcmVzdWx0c191cCwgZmVfcmVzdWx0c19kbikKVGFibGVfdGl0bGUgPC0gIlRhYmxlIG9mIGVucmljaGVkIEdPIHRlcm1ucyAoYnkgaW50ZXJ2YWwpIgp0YWJsZV9uYW1lIDwtICJGRV9HT19ieV9pbnRlcnZhbCIKZmVfcmVzdWx0cyRzb3VyY2UgPC0gYXMuZmFjdG9yKGZlX3Jlc3VsdHMkc291cmNlKQpkZnMgPC0gc3BsaXQuZGF0YS5mcmFtZShmZV9yZXN1bHRzLCBmZV9yZXN1bHRzJHNvdXJjZSkKCmBgYAoKIyMjIEdPIEJQCmBgYHtyIGVjaG89Riwgd2FybmluZz1GfQpzY3JvbGxYIDwtIFQKCnNyYyA8LSAiR086QlAiClRhYmxlX3RpdGxlIDwtICJUYWJsZSBvZiBlbnJpY2hlZCBHTzpCUCB0ZXJtbnMgKGJ5IGludGVydmFsKSIKdGFibGVfbmFtZSA8LSAiRkVfR09CUF9ieV9pbnRlcnZhbCIKZGZzW1tzcmNdXSRzb3VyY2UgPC0gYXMuZmFjdG9yKGRmc1tbc3JjXV0kc291cmNlKQpEVDo6ZGF0YXRhYmxlKGZvcm1hdF9mZV9yZXN1bHRzKGRmc1tbc3JjXV0pWywtMV0sIHJvd25hbWVzID0gRkFMU0UsIGZpbHRlciA9ICd0b3AnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9IFRhYmxlX3RpdGxlLCBleHRlbnNpb25zID0gJ0J1dHRvbnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAnQmZydGlwJywgc2Nyb2xsWD1zY3JvbGxYLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBsaXN0KGxpc3QoZXh0ZW5kPSdjc3YnLCB0aXRsZT10YWJsZV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZXh0ZW5kPSdleGNlbCcsIGZpbGVuYW1lPXRhYmxlX25hbWUpLCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChleHRlbmQ9J3BkZicsIGZpbGVuYW1lPXRhYmxlX25hbWUpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9XaWR0aCA9IFRSVUUsIHBhZ2VMZW5ndGggPSAyMCkpCmBgYAoKCgojIyMgR08gTUYKYGBge3IgZWNobz1GLCB3YXJuaW5nPUZ9CnNyYyA8LSAiR086TUYiClRhYmxlX3RpdGxlIDwtICJUYWJsZSBvZiBlbnJpY2hlZCBHTzpNRiB0ZXJtbnMgKGJ5IGludGVydmFsKSIKdGFibGVfbmFtZSA8LSAiRkVfR09NRl9ieV9pbnRlcnZhbCIKZGZzW1tzcmNdXSRzb3VyY2UgPC0gYXMuZmFjdG9yKGRmc1tbc3JjXV0kc291cmNlKQpEVDo6ZGF0YXRhYmxlKGZvcm1hdF9mZV9yZXN1bHRzKGRmc1tbc3JjXV0pWywtMV0sIHJvd25hbWVzID0gRkFMU0UsIGZpbHRlciA9ICd0b3AnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9IFRhYmxlX3RpdGxlLCBleHRlbnNpb25zID0gJ0J1dHRvbnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAnQmZydGlwJywgc2Nyb2xsWD1zY3JvbGxYLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBsaXN0KGxpc3QoZXh0ZW5kPSdjc3YnLCB0aXRsZT10YWJsZV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZXh0ZW5kPSdleGNlbCcsIGZpbGVuYW1lPXRhYmxlX25hbWUpLCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChleHRlbmQ9J3BkZicsIGZpbGVuYW1lPXRhYmxlX25hbWUpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9XaWR0aCA9IFRSVUUsIHBhZ2VMZW5ndGggPSAyMCkpCmBgYAoKIyMjIEdPIENDCmBgYHtyIGVjaG89Riwgd2FybmluZz1GfQpzcmMgPC0gIkdPOkNDIgpUYWJsZV90aXRsZSA8LSAiVGFibGUgb2YgZW5yaWNoZWQgR086Q0MgdGVybW5zIChieSBpbnRlcnZhbCkiCnRhYmxlX25hbWUgPC0gIkZFX0dPQ0NfYnlfaW50ZXJ2YWwiCmRmc1tbc3JjXV0kc291cmNlIDwtIGFzLmZhY3RvcihkZnNbW3NyY11dJHNvdXJjZSkKRFQ6OmRhdGF0YWJsZShmb3JtYXRfZmVfcmVzdWx0cyhkZnNbW3NyY11dKVssLTFdLCByb3duYW1lcyA9IEZBTFNFLCBmaWx0ZXIgPSAndG9wJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHRpb24gPSBUYWJsZV90aXRsZSwgZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QoZG9tID0gJ0JmcnRpcCcsIHNjcm9sbFg9c2Nyb2xsWCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zID0gbGlzdChsaXN0KGV4dGVuZD0nY3N2JywgdGl0bGU9dGFibGVfbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGV4dGVuZD0nZXhjZWwnLCBmaWxlbmFtZT10YWJsZV9uYW1lKSwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZXh0ZW5kPSdwZGYnLCBmaWxlbmFtZT10YWJsZV9uYW1lKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvV2lkdGggPSBUUlVFLCBwYWdlTGVuZ3RoID0gMjApKQpgYGAKCiMjIyBSZWFjdG9tZQpgYGB7ciBlY2hvPUYsIHdhcm5pbmc9Rn0Kc3JjIDwtICJSRUFDIgpUYWJsZV90aXRsZSA8LSAiVGFibGUgb2YgZW5yaWNoZWQgUkVBQ1RPTUUgdGVybW5zIChieSBpbnRlcnZhbCkiCnRhYmxlX25hbWUgPC0gIkZFX1JFQUNfYnlfaW50ZXJ2YWwiCmRmc1tbc3JjXV0kc291cmNlIDwtIGFzLmZhY3RvcihkZnNbW3NyY11dJHNvdXJjZSkKRFQ6OmRhdGF0YWJsZShmb3JtYXRfZmVfcmVzdWx0cyhkZnNbW3NyY11dKVssLTFdLCByb3duYW1lcyA9IEZBTFNFLCBmaWx0ZXIgPSAndG9wJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHRpb24gPSBUYWJsZV90aXRsZSwgZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QoZG9tID0gJ0JmcnRpcCcsIHNjcm9sbFg9c2Nyb2xsWCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zID0gbGlzdChsaXN0KGV4dGVuZD0nY3N2JywgdGl0bGU9dGFibGVfbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGV4dGVuZD0nZXhjZWwnLCBmaWxlbmFtZT10YWJsZV9uYW1lKSwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZXh0ZW5kPSdwZGYnLCBmaWxlbmFtZT10YWJsZV9uYW1lKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvV2lkdGggPSBUUlVFLCBwYWdlTGVuZ3RoID0gMjApKQpgYGAKCiMjIyBUcmFuc2NyaXB0aW9uX0ZhY3RvcnMKYGBge3IgZWNobz1GLCB3YXJuaW5nPUZ9CnNyYyA8LSAiVEYiClRhYmxlX3RpdGxlIDwtICJUYWJsZSBvZiBlbnJpY2hlZCBURiB0ZXJtbnMgKGJ5IGludGVydmFsKSIKdGFibGVfbmFtZSA8LSAiRkVfVEZfYnlfaW50ZXJ2YWwiCmRmc1tbc3JjXV0kc291cmNlIDwtIGFzLmZhY3RvcihkZnNbW3NyY11dJHNvdXJjZSkKRFQ6OmRhdGF0YWJsZShmb3JtYXRfZmVfcmVzdWx0cyhkZnNbW3NyY11dKVssLTFdLCByb3duYW1lcyA9IEZBTFNFLCBmaWx0ZXIgPSAndG9wJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHRpb24gPSBUYWJsZV90aXRsZSwgZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QoZG9tID0gJ0JmcnRpcCcsIHNjcm9sbFg9c2Nyb2xsWCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zID0gbGlzdChsaXN0KGV4dGVuZD0nY3N2JywgdGl0bGU9dGFibGVfbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGV4dGVuZD0nZXhjZWwnLCBmaWxlbmFtZT10YWJsZV9uYW1lKSwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZXh0ZW5kPSdwZGYnLCBmaWxlbmFtZT10YWJsZV9uYW1lKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvV2lkdGggPSBUUlVFLCBwYWdlTGVuZ3RoID0gMjApKQpgYGAKCgoKIyMjIEMyIGdlbmUgc2V0cwoKR2VuZSBzZXRzIGluIHRoaXMgY29sbGVjdGlvbiBhcmUgY3VyYXRlZCBmcm9tIHZhcmlvdXMgc291cmNlcywgaW5jbHVkaW5nIG9ubGluZSBwYXRod2F5IGRhdGFiYXNlcyBhbmQgdGhlIGJpb21lZGljYWwgbGl0ZXJhdHVyZS4gTWFueSBzZXRzIGFyZSBhbHNvIGNvbnRyaWJ1dGVkIGJ5IGluZGl2aWR1YWwgZG9tYWluIGV4cGVydHMuIFRoZSBnZW5lIHNldCBwYWdlIGZvciBlYWNoIGdlbmUgc2V0IGxpc3RzIGl0cyBzb3VyY2UuIFRoZSBDMiBjb2xsZWN0aW9uIGlzIGRpdmlkZWQgaW50byB0aGUgZm9sbG93aW5nIHR3byBzdWItY29sbGVjdGlvbnM6IENoZW1pY2FsIGFuZCBnZW5ldGljIHBlcnR1cmJhdGlvbnMgKENHUCkgYW5kIENhbm9uaWNhbCBwYXRod2F5cyAoQ1ApLgoKYGBge3IgZWNobz1GLCB3YXJuaW5nPUZ9CgpmZV9yZXN1bHRzLmMyX3VwIDwtIHRhcl9yZWFkKCJjMi5mZS5yZXN1bHRzLnVwIikKZmVfcmVzdWx0cy5jMl9kbiA8LSB0YXJfcmVhZCgiYzIuZmUucmVzdWx0cy5kbiIpCmZlX3Jlc3VsdHMuYzJfZG4kZGlyZWN0aW9uIDwtICJET1dOIgpmZV9yZXN1bHRzLmMyX3VwJGRpcmVjdGlvbiA8LSAiVVAiIApmZV9yZXN1bHRzLmMyIDwtIHJiaW5kKGZlX3Jlc3VsdHMuYzJfdXAsIGZlX3Jlc3VsdHMuYzJfZG4pClRhYmxlX3RpdGxlIDwtICJUYWJsZSBvZiBlbnJpY2hlZCBDMiBnZW5lIHNldHMgKGJ5IGludGVydmFsKSIKdGFibGVfbmFtZSA8LSAiRkVfYzJfYnlfaW50ZXJ2YWwiCgpmZV9yZXN1bHRzLmMyJHNvdXJjZSA8LSBhcy5mYWN0b3IoZmVfcmVzdWx0cy5jMiRzb3VyY2UpCmRmcyA8LSBzcGxpdC5kYXRhLmZyYW1lKGZlX3Jlc3VsdHMuYzIsIGZlX3Jlc3VsdHMuYzIkc291cmNlKQoKRFQ6OmRhdGF0YWJsZShmb3JtYXRfZmVfcmVzdWx0cyhmZV9yZXN1bHRzLmMyKSwgcm93bmFtZXMgPSBGQUxTRSwgZmlsdGVyID0gJ3RvcCcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0aW9uID0gVGFibGVfdGl0bGUsIGV4dGVuc2lvbnMgPSAnQnV0dG9ucycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KGRvbSA9ICdCZnJ0aXAnLCBzY3JvbGxYPXNjcm9sbFgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyA9IGxpc3QobGlzdChleHRlbmQ9J2NzdicsIHRpdGxlPXRhYmxlX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChleHRlbmQ9J2V4Y2VsJywgZmlsZW5hbWU9dGFibGVfbmFtZSksICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGV4dGVuZD0ncGRmJywgZmlsZW5hbWU9dGFibGVfbmFtZSkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1dpZHRoID0gVFJVRSwgcGFnZUxlbmd0aCA9IDIwKSkKYGBgCgojIyMgSGFsbG1hcmsgZ2VuZSBzZXRzCmBgYHtyIGVjaG89Riwgd2FybmluZz1GfQpmZV9yZXN1bHRzLmhfdXAgPC0gdGFyX3JlYWQoImguZmUucmVzdWx0cy51cCIpCmZlX3Jlc3VsdHMuaF9kbiA8LSB0YXJfcmVhZCgiaC5mZS5yZXN1bHRzLmRuIikKCmZlX3Jlc3VsdHMuaF9kbiRkaXJlY3Rpb24gPC0gIkRPV04iCmZlX3Jlc3VsdHMuaF91cCRkaXJlY3Rpb24gPC0gIlVQIiAKZmVfcmVzdWx0cy5oIDwtIHJiaW5kKGZlX3Jlc3VsdHMuaF91cCwgZmVfcmVzdWx0cy5oX2RuKQpUYWJsZV90aXRsZSA8LSAiVGFibGUgb2YgZW5yaWNoZWQgaGFsbG1hcmsgZ2VuZSBzZXRzIChieSBpbnRlcnZhbCkiCnRhYmxlX25hbWUgPC0gIkZFX2hhbGxtYXJrX2J5X2ludGVydmFsIgpEVDo6ZGF0YXRhYmxlKGZvcm1hdF9mZV9yZXN1bHRzKGZlX3Jlc3VsdHMuaCksIHJvd25hbWVzID0gRkFMU0UsIGZpbHRlciA9ICd0b3AnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9IFRhYmxlX3RpdGxlLCBleHRlbnNpb25zID0gJ0J1dHRvbnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAnQmZydGlwJywgc2Nyb2xsWD1zY3JvbGxYLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBsaXN0KGxpc3QoZXh0ZW5kPSdjc3YnLCB0aXRsZT10YWJsZV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZXh0ZW5kPSdleGNlbCcsIGZpbGVuYW1lPXRhYmxlX25hbWUpLCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChleHRlbmQ9J3BkZicsIGZpbGVuYW1lPXRhYmxlX25hbWUpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9XaWR0aCA9IFRSVUUsIHBhZ2VMZW5ndGggPSAyMCkpCmBgYAoKCiMjIHsudGFic2V0IC50YWJzZXQtZmFkZX0KCjxoMyBpZD0iSW50ZWdyYXRpb24iPiA8YSBocmVmPSIjYmFjayI+NC4gT21pY3MgSW50ZWdyYXRpb24gPC9hPjwvaDM+Cgo8aDQ+NC4xIEFUQUMgdnMuIFRyYW5zY3JpcHRvbWljcyA8L2g0PgpgYGB7ciBlY2hvPUZ9CmV4cHJlc3Npb25fZGF0YSA8LSB0YXJfcmVhZChERUEpCnByb3Rlb21pY3NfZGF0YQpyZWFkLnRhYmxlKCJyZXN1bHRzL3Byb3Rlb21pY3MvcHJvdGVvbWljcy5jc3YiLCBoZWFkZXI9VCkgJT4lIHJlbmFtZShTeW1ib2w9U1lNQk9MLCBsb2cyRm9sZENoYW5nZT1sb2dGQywgcHZhbHVlPXAudmFsLCBwYWRqPXAuYWRqKQpgYGAKCgo8aDU+IFRvd2VyIFBsb3Q6IERpZmZlcmVudGlhbCBhY2Nlc3NpYmlsaXR5IG9mIHRvcCAyNSB1cC0gYW5kIGRvd24tcmVndWxhdGVkIGdlbmVzIDwvaDU+CgpgYGB7ciBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9Niwgd2FybmluZz1GLCBlY2hvPUZ9ClRQIDwtIHRhcl9yZWFkKFRvd2VyUGxvdF8yNSkKcGRmKGZpbGUgPSAicGFwZXIvcGxvdHMvdG93ZXJwbG90X3RvcDI1X29uX2JvdGhfc2lkZXMucGRmIiwgd2lkdGggPSAxNSwgaGVpZ2h0ID0gNikKVFAKZGV2Lm9mZigpCgpgYGAKYGBge3IgZWNobz1GfQpkb3dubG9hZHRoaXM6OmRvd25sb2FkX2ZpbGUoCiAgcGF0aCA9IChwYXN0ZSgicGFwZXIvcGxvdHMvIix0cF9wLCBzZXA9IiIpKSwKICBvdXRwdXRfbmFtZSA9IHRwX3AsCiAgYnV0dG9uX2xhYmVsID0gIkRvd25sb2FkIHBkZiBmaWxlIiwKICBidXR0b25fdHlwZSA9ICJzdWNjZXNzIiwKICBoYXNfaWNvbiA9IFRSVUUsCiAgaWNvbiA9ICJmYSBmYS1zYXZlIiwKICBzZWxmX2NvbnRhaW5lZCA9IFQKKQpgYGAKCgo8aDU+IENvcnJlbGF0aW9uIFBsb3QgPC9oNT4KCiMjIyBBbGwKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEwLCBlY2hvPUZ9CmNvcnJlbGF0aW9uX3Bsb3QoREFBID0gdGFyX3JlYWQocmVzdWx0cyksIERFQSA9IHRhcl9yZWFkKERFQSksIAogICAgICAgICAgICAgICAgIGxmYzEgPSAwLCBwYWRqMSA9IDEsIGxmYzI9MCwgcGFkajI9MSwgZXMuY3V0ID0gLjU2KQoKcGRmKGZpbGUgPSAicGFwZXIvcGxvdHMvY29ycmVsYXRpb24ucGxvdC5wZGYiLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMCkKY29ycmVsYXRpb25fcGxvdChEQUEgPSB0YXJfcmVhZChyZXN1bHRzKSwgREVBID0gdGFyX3JlYWQoREVBKSwgCiAgICAgICAgICAgICAgICAgbGZjMSA9IDAsIHBhZGoxID0gMSwgbGZjMj0wLCBwYWRqMj0xLCBlcy5jdXQgPSAuNTYpCmRldi5vZmYoKQpgYGAKYGBge3IgZWNobz1GfQpkb3dubG9hZHRoaXM6OmRvd25sb2FkX2ZpbGUoCiAgcGF0aCA9IChwYXN0ZSgicGFwZXIvcGxvdHMvIixjcF9hbGxfcCwgc2VwPSIiKSksCiAgb3V0cHV0X25hbWUgPSBjcF9hbGxfcCwKICBidXR0b25fbGFiZWwgPSAiRG93bmxvYWQgcGRmIGZpbGUiLAogIGJ1dHRvbl90eXBlID0gInN1Y2Nlc3MiLAogIGhhc19pY29uID0gVFJVRSwKICBpY29uID0gImZhIGZhLXNhdmUiLAogIHNlbGZfY29udGFpbmVkID0gVAopCgoKCmBgYAoKIyMjIFNpZ25pZmljYW50IGRpZmZlcmVudGlhbCBhY2Nlc3NpYmlsaXR5CmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMCwgZWNobz1GfQpjb3JyZWxhdGlvbl9wbG90KERBQSA9IHRhcl9yZWFkKHJlc3VsdHMpLCBERUEgPSB0YXJfcmVhZChERUEpLCAKICAgICAgICAgICAgICAgICBsZmMxID0gMCwgcGFkajEgPSAuMDUsIGxmYzI9MCwgcGFkajI9MSwgZXMuY3V0ID0gLjU2KQoKcGRmKGZpbGUgPSAicGFwZXIvcGxvdHMvY29ycmVsYXRpb24ucGxvdC5EQS5zaWduaWZpY2FudC5wZGYiLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMCkKY29ycmVsYXRpb25fcGxvdChEQUEgPSB0YXJfcmVhZChyZXN1bHRzKSwgREVBID0gdGFyX3JlYWQoREVBKSwgCiAgICAgICAgICAgICAgICAgbGZjMSA9IDAsIHBhZGoxID0gLjA1LCBsZmMyPTAsIHBhZGoyPTEsIGVzLmN1dCA9IC41NikKZGV2Lm9mZigpCmBgYApgYGB7ciBlY2hvPUZ9CmRvd25sb2FkdGhpczo6ZG93bmxvYWRfZmlsZSgKICBwYXRoID0gKHBhc3RlKCJwYXBlci9wbG90cy8iLGNwX2Rhc19wLCBzZXA9IiIpKSwKICBvdXRwdXRfbmFtZSA9IGNwX2Rhc19wLAogIGJ1dHRvbl9sYWJlbCA9ICJEb3dubG9hZCBwZGYgZmlsZSIsCiAgYnV0dG9uX3R5cGUgPSAic3VjY2VzcyIsCiAgaGFzX2ljb24gPSBUUlVFLAogIGljb24gPSAiZmEgZmEtc2F2ZSIsCiAgc2VsZl9jb250YWluZWQgPSBUCikKYGBgCgojIyMgU2lnbmlmaWNhbnQgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24KYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEwLCBlY2hvPUZ9CmNvcnJlbGF0aW9uX3Bsb3QoREFBID0gdGFyX3JlYWQocmVzdWx0cyksIERFQSA9IHRhcl9yZWFkKERFQSksIAogICAgICAgICAgICAgICAgIGxmYzEgPSAwLCBwYWRqMSA9IDEsIGxmYzI9MCwgcGFkajI9LjA1LCBlcy5jdXQgPSAuNTYpCgpwZGYoZmlsZSA9ICJwYXBlci9wbG90cy9jb3JyZWxhdGlvbi5wbG90LkRFLnNpZ25pZmljYW50LnBkZiIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDEwKQpjb3JyZWxhdGlvbl9wbG90KERBQSA9IHRhcl9yZWFkKHJlc3VsdHMpLCBERUEgPSB0YXJfcmVhZChERUEpLCAKICAgICAgICAgICAgICAgICBsZmMxID0gMCwgcGFkajEgPSAxLCBsZmMyPTAsIHBhZGoyPS4wNSwgZXMuY3V0ID0gLjU2KQpkZXYub2ZmKCkKCmBgYApgYGB7ciBlY2hvPUZ9CmRvd25sb2FkdGhpczo6ZG93bmxvYWRfZmlsZSgKICBwYXRoID0gKHBhc3RlKCJwYXBlci9wbG90cy8iLGNwX2Rlc19wLCBzZXA9IiIpKSwKICBvdXRwdXRfbmFtZSA9IGNwX2Rlc19wLAogIGJ1dHRvbl9sYWJlbCA9ICJEb3dubG9hZCBwZGYgZmlsZSIsCiAgYnV0dG9uX3R5cGUgPSAic3VjY2VzcyIsCiAgaGFzX2ljb24gPSBUUlVFLAogIGljb24gPSAiZmEgZmEtc2F2ZSIsCiAgc2VsZl9jb250YWluZWQgPSBUCikKYGBgCgojIyMgQm90aCBzaWduaWZpY2FudApgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTAsIGVjaG89Riwgd2FybmluZz1GfQpjb3JyZWxhdGlvbl9wbG90KERBQSA9IHRhcl9yZWFkKHJlc3VsdHMpLCBERUEgPSB0YXJfcmVhZChERUEpLCAKICAgICAgICAgICAgICAgICBsZmMxID0gMCwgcGFkajEgPSAwLjA1LCBsZmMyPTAsIHBhZGoyPS4wNSwgZXMuY3V0ID0gLjU2LCBpbmNsdWRlLnN5bWJvbHMgPSBUKQoKcGRmKGZpbGUgPSAicGFwZXIvcGxvdHMvY29ycmVsYXRpb24ucGxvdC5ib3RoLnNpZ25pZmljYW50LnBkZiIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDEwKQpjb3JyZWxhdGlvbl9wbG90KERBQSA9IHRhcl9yZWFkKHJlc3VsdHMpLCBERUEgPSB0YXJfcmVhZChERUEpLCAKICAgICAgICAgICAgICAgICBsZmMxID0gMCwgcGFkajEgPSAwLjA1LCBsZmMyPTAsIHBhZGoyPS4wNSwgZXMuY3V0ID0gLjU2LCBpbmNsdWRlLnN5bWJvbHMgPSBUKQpkZXYub2ZmKCkKYGBgCmBgYHtyIGVjaG89Rn0KZG93bmxvYWR0aGlzOjpkb3dubG9hZF9maWxlKAogIHBhdGggPSAocGFzdGUoInBhcGVyL3Bsb3RzLyIsY3BfYm9zX3AsIHNlcD0iIikpLAogIG91dHB1dF9uYW1lID0gY3BfYm9zX3AsCiAgYnV0dG9uX2xhYmVsID0gIkRvd25sb2FkIHBkZiBmaWxlIiwKICBidXR0b25fdHlwZSA9ICJzdWNjZXNzIiwKICBoYXNfaWNvbiA9IFRSVUUsCiAgaWNvbiA9ICJmYSBmYS1zYXZlIiwKICBzZWxmX2NvbnRhaW5lZCA9IFQKKQpgYGAKCgoKIyMgey50YWJzZXQgLnRhYnNldC1mYWRlfQoKPGgzIGlkPSJNb3RpZmFuYWx5c2lzRm9vdHByaW50aW5nIj4gPGEgaHJlZj0iI2JhY2siPjUuIE1vdGlmIG1hdGNoaW5nIGFuZCBmb290cHJpbnRpbmcgPC9hPjwvaDM+CgoKIyMgey50YWJzZXQgLnRhYnNldC1mYWRlfQo8aDQgaWQ9Ik1vdGlmYW5hbHlzaXNGb290cHJpbnRpbmdtYSI+PGEgaHJlZj0iI2JhY2siPiA1LjEgTW90aWYtYmFzZWQgYW5hbHlzaXMgPC9hPjwvaDQ+CgoKPGg1PlRhYmxlPC9oNT4KYGBge3IgZWNobz1GLCB3YXJuaW5nPUZ9CgpsaWJyYXJ5KEpBU1BBUjIwMjApCmxpYnJhcnkoVEZCU1Rvb2xzKQoKbW90aWZhbmFseXNpc19kaXIgPC0gInJlc3VsdHMvbW90aWYuYW5hbHlzaXMvIgpyb2kgPC0gcGFzdGUobW90aWZhbmFseXNpc19kaXIsICIvZW5yaWNobWVudC9yb2kvIixzZXA9IiIpCm1hdGNoIDwtIHBhc3RlKG1vdGlmYW5hbHlzaXNfZGlyLCAiL21hdGNoLyIsc2VwPSIiKQoKZnVsbHRlc3Rfc3RhdGlzdGljc19maWxlIDwtIHBhc3RlKHJvaSwgIi9mdWxsdGVzdF9zdGF0aXN0aWNzLnR4dCIsc2VwPSIiKQpiZWRfZmlsZSA8LSBwYXN0ZShtYXRjaCwgIi9yb2lfbXBicy5iZWQiLHNlcD0iIikKZnRfc3RhdHNpdGljc19kZiA8LSBmdWxsdGVzdF9zdGF0aXN0aWNzX2ZpbGUgJT4lIHJlYWQudGFibGUoaGVhZGVyID0gVCwgc2VwID0gIlx0IikKVGFibGVfdGl0bGUgPC0gIk1vdGlmIGVucmljaG1lbnQgYW5hbHlzaXMiCnRhYmxlX25hbWUgPC0gIk1vdGlmX2VucmljaG1lbnRfYW5hbHlzaXMiCgoKCgpkYiA8LSBmaWxlLnBhdGgoc3lzdGVtLmZpbGUoImV4dGRhdGEiLCBwYWNrYWdlPSJKQVNQQVIyMDIwIiksIAogICAgICAgICAgICAgICAgICAgICJKQVNQQVIyMDIwLnNxbGl0ZSIpCgpmdF9zdGF0c2l0aWNzX2RmIDwtIGZ0X3N0YXRzaXRpY3NfZGYgJT4lIHRpYmJsZTo6YWRkX2NvbHVtbihJRD1nc3ViKHBhdHRlcm4gPSAiW1s6cHVuY3Q6XV1bMS05XStbWzpwdW5jdDpdXS4qIiwgcmVwbGFjZW1lbnQgPSAiIiwgLiRGQUNUT1IpLCAuYmVmb3JlID0gIkZBQ1RPUiIpCgpnZXRGYW1pbHkgPC0gZnVuY3Rpb24oSUQpewogIHJldHVybihgJGAoYEBgKFRGQlNUb29sczo6Z2V0TWF0cml4QnlJRChKQVNQQVIyMDIwLCBJRCA9IElEKSx0YWdzKSxmYW1pbHkpKQp9CmdldEZhbWlseSA8LSAgVmVjdG9yaXplKGZ1bmN0aW9uKElEKSBgJGAoYEBgKFRGQlNUb29sczo6Z2V0TWF0cml4QnlJRChKQVNQQVIyMDIwLCBJRCA9IElEKSx0YWdzKSxmYW1pbHkpICU+JSB1bmxpc3QoKSwKICAgICAgICAgICAgICAgICAgICB2ZWN0b3JpemUuYXJncyA9IGMoIklEIikpCgoKZnRfc3RhdHNpdGljc19kZiRGQU1JTFkgPC0gTlVMTApmdF9zdGF0c2l0aWNzX2RmIDwtIGZ0X3N0YXRzaXRpY3NfZGYgJT4lIHRpYmJsZTo6YWRkX2NvbHVtbihGQU1JTFk9Z2V0RmFtaWx5KC4kSUQpICU+JSBhcy5jaGFyYWN0ZXIoKSwgLmJlZm9yZSA9ICJQLlZBTFVFIikKZnRfc3RhdHNpdGljc19kZiA8LSBmdF9zdGF0c2l0aWNzX2RmICU+JSB0aWJibGU6OmFkZF9jb2x1bW4oCiAgRm9sZENoYW5nZT0oYXMuZG91YmxlKGdzdWIocGF0dGVybiA9ICIlIixyZXBsYWNlbWVudCA9ICIiLC4kRlJFUSkpIC8KICAgICAgICAgICAgICAgICAgICAgIGFzLmRvdWJsZShnc3ViKHBhdHRlcm4gPSAiJSIsIHJlcGxhY2VtZW50ID0gIiIsIC4kQkFDSy5GUkVRLikpKSwgLmJlZm9yZSA9ICJQLlZBTFVFIikKZnRfc3RhdHNpdGljc19kZiA8LSBmdF9zdGF0c2l0aWNzX2RmICU+JSB0aWJibGU6OmFkZF9jb2x1bW4oR09JPWlmX2Vsc2UoZ3JlcGwocGF0dGVybiA9ICIoSnVufEZvcykiLC4kRkFNSUxZKSwgVCwgRiksIC5iZWZvcmU9IkZvbGRDaGFuZ2UiKQoKZnRfc3RhdHNpdGljc19kZiA8LSBmdF9zdGF0c2l0aWNzX2RmICU+JSBhZGRfY29sdW1uKFN5bWJvbD0uJEZBQ1RPUikKZnRfc3RhdHNpdGljc19kZiA8LSBmdF9zdGF0c2l0aWNzX2RmICU+JSBhZGRfY29sdW1uKGxvZzJGb2xkQ2hhbmdlPWxvZzIoLiRGb2xkQ2hhbmdlKSkKZnRfc3RhdHNpdGljc19kZiA8LSBmdF9zdGF0c2l0aWNzX2RmICU+JSBhZGRfY29sdW1uKHBhZGo9LiRDT1JSLlAuVkFMVUUpCgojZnRfc3RhdHNpdGljc19kZiRHRU5FUyA8LSBnc3ViKHBhdHRlcj0iLCIsIHJlcGxhY2VtZW50ID0gIiAiLCBmdF9zdGF0c2l0aWNzX2RmJEdFTkVTKQoKRFQ6OmRhdGF0YWJsZShmdF9zdGF0c2l0aWNzX2RmWywxOjEzXSwgcm93bmFtZXMgPSBGQUxTRSwgZmlsdGVyID0gJ3RvcCcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0aW9uID0gVGFibGVfdGl0bGUsIGV4dGVuc2lvbnMgPSAnQnV0dG9ucycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KGRvbSA9ICdCZnJ0aXAnLCBzY3JvbGxYPVQsICAgICBzY3JvbGxlcj1ULAogICAgZml4ZWRDb2x1bW5zID0gVFJVRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyA9IGxpc3QobGlzdChleHRlbmQ9J2NzdicsIHRpdGxlPXRhYmxlX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChleHRlbmQ9J2V4Y2VsJywgZmlsZW5hbWU9dGFibGVfbmFtZSksICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGV4dGVuZD0ncGRmJywgZmlsZW5hbWU9dGFibGVfbmFtZSkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1dpZHRoID0gVCwgcGFnZUxlbmd0aCA9IDEwKSkKCmBgYAoKCjxoNT5PbmUtc2lkZWQgVm9sY2FubyBvZiBlbnJpY2hlZCBtb3RpZnM8L2g1PgoKQSA9IG51bWJlciBvZiBpbnB1dCByZWdpb25zIHdpdGggYXQgbGVhc3QgMSBvY2N1cnJlbmNlIG9mIHRoYXQgcGFydGljdWxhciB0cmFuc2NyaXB0aW9uIGZhY3Rvci4KQiA9IG51bWJlciBvZiBpbnB1dCByZWdpb25zIHdpdGggbm8gb2NjdXJyZW5jZSBvZiB0aGF0IHBhcnRpY3VsYXIgdHJhbnNjcmlwdGlvbiBmYWN0b3IuCkMgPSBudW1iZXIgb2YgcmFuZG9tIGJhY2tncm91bmQgcmVnaW9ucyB3aXRoIGF0IGxlYXN0IDEgb2NjdXJyZW5jZSBvZiB0aGF0IHBhcnRpY3VsYXIgdHJhbnNjcmlwdGlvbiBmYWN0b3IuCkQgPSBudW1iZXIgb2YgcmFuZG9tIGJhY2tncm91bmQgcmVnaW9ucyB3aXRoIG5vIG9jY3VycmVuY2Ugb2YgdGhhdCBwYXJ0aWN1bGFyIHRyYW5zY3JpcHRpb24gZmFjdG9yLgpIZXJlOiBmb3JlZ3JvdW5kIGZyZXF1ZW5jeSBpc3QgKEEvKEErQikpLCBiYWNrZ3JvdW5kIGZyZXF1ZW5jeSBpcyAoQy8oQytEKSkKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBlY2hvPUYsIHdhcm5pbmc9Rn0KdnBtcF90YWJsZSA8LSAKICBmdF9zdGF0c2l0aWNzX2RmICU+JSAKICB0aWJibGU6OmFkZF9jb2x1bW4oY29sb3I9aWZfZWxzZSguJHBhZGogPiAwLjA1IHwgLiRsb2cyRm9sZENoYW5nZSA8IC4xMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpZ2h0Z3JleSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfZWxzZShncmVwbCgiKEZvcy1yZWxhdGVkIGZhY3RvcnMpfChKdW4tcmVsYXRlZCBmYWN0b3JzKSIsIC4kRkFNSUxZKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjZDUwMDU0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJibGFjayIpKSwgCiAgICAgICAgICAgICAgICAgICAgIC5iZWZvcmU9IklEIikKCnBkZihmaWxlPSJwYXBlci9wbG90cy92b2xjYW5vLnBsb3QubW90aWZzLnBkZiIsIHdpZHRoPTEwLCBoZWlnaHQ9NykKCmZjIDwtIDEuMTUKcGxvdF9Wb2xjYW5vKERFRy50YWJsZSA9IHZwbXBfdGFibGUsIHNlbGVjdGVkLmdlbmVzID0gdnBtcF90YWJsZSAlPiUgZmlsdGVyKEdPST09VCAmIHBhZGogPD0gMC4wNSkgJT4lIHNlbGVjdChTeW1ib2wpJT4lIHVubGlzdCgpICU+JSB1bm5hbWUoKSwgCiAgICAgICAgICAgICAgICAgY29sb3JzLnNlbGVjdGVkLmdlbmVzID0gYygiI2Q1MDA1NCIpLCAgbDJmYyA9bG9nMihmYyksIHBhZGogPSAwLjA1LAogICAgICAgICAgICAgICAgIHhsYWI9ImxvZzIoRkMpIG9mIE1vdGlmIEVucmljaG1lbnQgLSBLTyB2cy4gQmFja2dyb3VuZCIsCiAgICAgICAgICAgICAgICAgcHQuc2l6ZSA9IDIsIHBvaW50LmNvbG9ycyA9IHZwLnBvaW50LmNvbG9ycywgcmVwZWw9RiwKICAgICAgICAgICAgICAgICBwdC5ib3JkZXIuY29sb3IgPSAibGlnaHRncmV5IiwKICAgICAgICAgICAgICAgICB5bGltPWMoMCwgMTI4KSwgeGxpbT1jKC0wLC41KSxzdWJ0aXRsZSA9ICJKVU4tIG9yL2FuZCBGT1MtcmVsYXRlZCBtb3RpZnMgaW4gcmVkIiwKICAgICAgICAgICAgICAgICB0aXRsZT0gIk9uZS1zaWRlZCBWb2xjYW5vIG9mIGVucmljaGVkIG1vdGlmcyIsIHRpdGxlLmNvbG9yID0gImRhcmtibHVlIikgKyBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeD1sb2cyKGZjKSwgeT01MCwgbGFiZWw9ZmMsIGNvbG9yPSJyZWQiKQpkZXYub2ZmKCkKYGBgCgoKCgoKYGBge3IgZWNobz1GfQpkb3dubG9hZHRoaXM6OmRvd25sb2FkX2ZpbGUoCiAgcGF0aCA9IChwYXN0ZSgicGFwZXIvcGxvdHMvIix2cG1fcCwgc2VwPSIiKSksCiAgb3V0cHV0X25hbWUgPSB2cG1fcCwKICBidXR0b25fbGFiZWwgPSAiRG93bmxvYWQgcGRmIGZpbGUiLAogIGJ1dHRvbl90eXBlID0gInN1Y2Nlc3MiLAogIGhhc19pY29uID0gVFJVRSwKICBpY29uID0gImZhIGZhLXNhdmUiLAogIHNlbGZfY29udGFpbmVkID0gVAopCmBgYAoKCgoKIyMgey50YWJzZXQgLnRhYnNldC1mYWRlfQoKPGg0IGlkPSJNb3RpZmFuYWx5c2lzRm9vdHByaW50aW5nZnAiPjxhIGhyZWY9IiNiYWNrIj4gNS4yIEZvb3RwcmludGluZyA8L2E+PC9oND4KYGBge3IgZWNobz1GfQoKZm9vdHByaW50aW5nX2RpciA8LSAicmVzdWx0cy9mb290cHJpbnRpbmcvIgpkaWZmX2Zvb3RwcmludHNfZGlyIDwtIHBhc3RlKGZvb3RwcmludGluZ19kaXIsICIvNF9kaWZmZXJlbnRpYWxfZm9vdHByaW50cy9MeW5LT19MeW5XVC8iLCBzZXA9IiIpCgphY3Rpdml0eV9wbG90IDwtIHJlYWQudGFibGUoZmlsZSA9IHBhc3RlKGRpZmZfZm9vdHByaW50c19kaXIsICIvZGlmZmVyZW50aWFsX3N0YXRpc3RpY3MudHh0Iiwgc2VwPSIiKSwgaGVhZGVyID0gVCwgc2VwID0gIlx0IikKCgpEVDo6ZGF0YXRhYmxlKGFjdGl2aXR5X3Bsb3QsIHJvd25hbWVzID0gRkFMU0UsIGZpbHRlciA9ICd0b3AnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9ICJGb290cHJpbnRpbmcgYW5hbHlzaXMiLCBleHRlbnNpb25zID0gJ0J1dHRvbnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAnQmZydGlwJywgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxlcj1ULCBmaXhlZENvbHVtbnMgPSBGLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zID0gbGlzdChsaXN0KGV4dGVuZD0nY3N2JywgdGl0bGU9dGFibGVfbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGV4dGVuZD0nZXhjZWwnLCBmaWxlbmFtZT10YWJsZV9uYW1lKSwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoZXh0ZW5kPSdwZGYnLCBmaWxlbmFtZT10YWJsZV9uYW1lKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvV2lkdGggPSBULCBwYWdlTGVuZ3RoID0gMTApKQoKCmBgYAoKPGg1PlN1bW1hcnk8L2g1PgoKIyMjIENvbWJpbmVkCmBgYHtyIGVjaG89RiwgZmlnLndpZHRoPTIwLCBmaWcuaGVpZ2h0PTcsIHdhcm5pbmc9Rn0gIApsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGdncHVicikKZm9vdHByaW50aW5nLnBsb3Qubm9ybSA8LSBmb290cHJpbnRpbmdfcGxvdChhY3Rpdml0eV9kZj1hY3Rpdml0eV9wbG90LCByZXBlbD0ibGFiZWwiLCByZXBlbC50ZXh0LmNvbG9yPSJibGFjayIsIHJlcGVsLnRleHQuc2l6ZSA9IDMsIHNlbGVjdGVkLmdlbmVzID0gYygiIiksIHB0LmNvbG9ycz1jKCJyZWQiLCAiZ3JleSIsICJzdGVlbGJsdWUiKSwgcmVwZWwubWF4Lm92ZXJsYXBzID0gMjAwMDAwMCwgcHQuc2l6ZXMgPSBjKDIsMiwyLDIpLCB0aXRsZT0iQWN0aXZpdHkgc2NvcmUgZGlzdHJpYnV0aW9uIiwgIHRpdGxlLmNvbG9yID0gIiMwMDAwODAiLCB0aXRsZS5mYWNlID0gInBsYWluIilbWzFdXQoKZm9vdHByaW50aW5nLnBsb3Qudm9sY2FubyA8LSBmb290cHJpbnRpbmdfcGxvdChhY3Rpdml0eV9kZj1hY3Rpdml0eV9wbG90LCBhY3Rpdml0eSA9ICJaX3Njb3JlIiwgbG9nMTAuc2Vjb25kLnZhcmlhYmxlPVQsIHB0LmNvbG9ycz1jKCJyZWQiLCAiZ3JleSIsICJzdGVlbGJsdWUiKSwgc2Vjb25kLnZhcmlhYmxlID0gIlBfdmFsdWVzIiwgc2VsZWN0ZWQuZ2VuZXMgPSBjKCIiKSwgeWxpbT1jKC01LDUpLCBwdC5zaXplcyA9IGMoMiwwLjUsMiwyKSwgeWxhYiA9ICJLTyA8LS0gei1zY29yZSBvZiBBY3Rpdml0eSBTY29yZSAtLT4gV1QiLCB4bGFiPSAiLWxvZzEwKGFkanVzdGVkIHAtdmFsdWUpIFtzaWduaWZpY2FuY2VdIiAsc2lnbi5obGluZSA9ICJib3RoIiwgc2lnbi5oY3V0ID0gMSwgc2lnbi52Y3V0ID0gLWxvZzEwKDAuMDUpLCBzaWduLnZsaW5lID0gIm9uZSIsIGNvb3JkX2ZsaXAgPSBULCB0aXRsZT0iQWN0aXZpdHkgc2NvcmUgdnMuIEFkanVzdGVkIHAtVmFsdWUiLCB0aXRsZS5jb2xvciA9ICIjMDAwMDgwIiwgdGl0bGUuZmFjZSA9ICJwbGFpbiIpW1sxXV0KCmdncGxvdGlmeTo6YXMuZ2dwbG90KGNvd3Bsb3Q6OnBsb3RfZ3JpZChjb3dwbG90OjpwbG90X2dyaWQoZm9vdHByaW50aW5nLnBsb3Qubm9ybSwgZ2dwbG90KCkrdGhlbWVfdm9pZCgpLCBuY29sPTEsIHJlbF9oZWlnaHRzID0gYyg0MCwxKSksIGZvb3RwcmludGluZy5wbG90LnZvbGNhbm8sIG5jb2w9MikpICsgZ2d0aXRsZSgiRm9vdHByaW50aW5nIGFuYWx5c2lzIC0gU3VtbWFyeSIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0gMC41LCBmYWNlID0gImJvbGQiLCBjb2xvcj0iIzgwMDA4MCIsIHNpemU9MjApKQpgYGAKCgoKIyMjIEFjdGl2aXR5IFBsb3QKQWN0aXZpdHkgcGxvdCBzaG93aW5nIHRoZSBkaXN0cmlidXRpb24gb2Ygei10cmFuc2Zvcm1lbmQgYWN0aXZpdHkgc2NvcmVzIG9mIHRoZSAKdW5kZXJseWluZyBtb3RpZnMgKHktYXhpcykgYXMgY29tcHV0ZWQgYnkgSElOVC1BVEFDLiBPbiB0aGUgeC1heGlzIHRoZSBwb2ludHMgYXJlCmRpc3RyaWJ1dGVkIHJhbmRvbWx5IHVzaW5nIHRoZSBiYXNlIFIgc2FtcGxlIGZ1bmN0aW9uIHdpdGggcmVwbGFjZT1UIGFuZCBzZXR0aW5nIApzZWVkPTEyMy4gTW90aWZzIHdpdGggZGlmZmVyZW50aWFsIGZvb3RwcmludGluZyAocC1WYWx1ZSA8PTAuMDUgYW5kIHx6LVNjb3JlfCA+PSAxKSAKYXJlIGhpZ2hsaWdodGVkIGluIHJlZCAoZW5yaWNoZWQgaW4gS08pIG9yIGluIGJsdWUgKGVucmljaGVkIGluIFdUKS4gCmBgYHtyIGVjaG89RiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIHdhcm5pbmc9Rn0gIApmb290cHJpbnRpbmcucGxvdC5ub3JtCnBkZihmaWxlID0gInBhcGVyL3Bsb3RzL2Zvb3RwcmludGluZy5hY3Rpdml0eS5wbG90LnBkZiIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDcpCmZvb3RwcmludGluZy5wbG90Lm5vcm0KZGV2Lm9mZigpCmBgYAoKIyMjIFZvbGNhbm8tTGlrZSBQbG90IChaLXNjb3JlIHZzLiBBZGp1c3RlZCBwLVZhbHVlKQpWb2xjYW5vIHBsb3Qgc2hvd2luZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gei10cmFuc2Zvcm1lZCBhY3Rpdml0eSBzY29yZXMgYXMgCmNvbXB1dGVkIGJ5IEhJTlQtQVRBQyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgcC12YWx1ZXMuIE1vdGlmcyB3aXRoIGRpZmZlcmVudGlhbApmb290cHJpbnRpbmcgKHAtVmFsdWUgPD0gMC4wNSBhbmQgfHotU2NvcmV8ID49IDEpIGFyZSBoaWdobGlnaHRlZCBpbiByZWQgCihlbnJpY2hlZCBpbiBLTykgb3IgaW4gYmx1ZSAoZW5yaWNoZWRpbiBXVCkuIAoKYGBge3IgZWNobz1GLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Nywgd2FybmluZz1GfSAgCmZvb3RwcmludGluZy5wbG90LnZvbGNhbm8KCnBkZihmaWxlID0gInBhcGVyL3Bsb3RzL2Zvb3RwcmludGluZy5wbG90LnZvbGNhbm8ucGRmIiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNykKZm9vdHByaW50aW5nLnBsb3Qudm9sY2FubwpkZXYub2ZmKCkKYGBgCgojIyMgVm9sY2Fuby1MaWtlIFBsb3QgKGxvZzJGQyBvZiBQcm90ZWN0aW9uIFNjb3JlIHZzLiBBZGp1c3RlZCBwLVZhbHVlKQpWb2xjYW5vIHBsb3Qgc2hvd2luZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gbG9nMiBmb2xkIGNoYW5nZSBvZiBwcm90ZWN0aW9uCnNjb3JlIChXVCB2cy4gS08pIGFuZCB0aGUgY29ycmVzcG9uZGluZyBwLXZhbHVlcy4gTW90aWZzIHdpdGggdG9wIGRpZmZlcmVudGlhbApmb290cHJpbnRpbmcgKHAtVmFsdWUgPD0gMC4wNSBhbmQgfGwyZmN8ID49IC4xKSBhcmUgaGlnaGxpZ2h0ZWQgaW4gcmVkIAooZW5yaWNoZWQgaW4gS08pIG9yIGluIGJsdWUgKGVucmljaGVkaW4gV1QpLiAKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9OCwgZWNobz1GLCB3YXJuaW5nPUZ9CgpleHQuYWN0aXZpdHkucGxvdCA8LSBhY3Rpdml0eV9wbG90ICU+JSBhZGRfY29sdW1uKGxvZzJGQz1sb2cyKC4kUHJvdGVjdGlvbl9TY29yZV9MeW5XVC8uJFByb3RlY3Rpb25fU2NvcmVfTHluS08pKQoKZm9vdHByaW50aW5nX3Bsb3QoYWN0aXZpdHlfZGY9ZXh0LmFjdGl2aXR5LnBsb3QsIGFjdGl2aXR5ID0gImxvZzJGQyIsIGxvZzEwLnNlY29uZC52YXJpYWJsZT1ULCBwdC5jb2xvcnM9YygicmVkIiwgImdyZXkiLCAic3RlZWxibHVlIiksIHNlY29uZC52YXJpYWJsZSA9ICJQX3ZhbHVlcyIsIHNlbGVjdGVkLmdlbmVzID0gYygiIiksIHlsaW09YygtMSwxKSwgcHQuc2l6ZXMgPSBjKDIsMC41LDIsMiksIHlsYWIgPSAiS08gPC0tIExvZzIgb2YgUHJvdGVjdGlvbiBTY29yZSAtLT4gV1QiLCB4bGFiPSAiLWxvZzEwKGFkanVzdGVkIHAtdmFsdWUpIFtzaWduaWZpY2FuY2VdIiAsc2lnbi5obGluZSA9ICJib3RoIiwgc2lnbi5oY3V0ID0gLjEsIHNpZ24udmN1dCA9IC1sb2cxMCgwLjA1KSwgc2lnbi52bGluZSA9ICJvbmUiLCBjb29yZF9mbGlwID0gVCwgdGl0bGU9IkxvZzIgb2YgUHJvdGVjdGlvbiBTY29yZSB2cy4gQWRqdXN0ZWQgcC1WYWx1ZSIsIHRpdGxlLmNvbG9yID0gIiMwMDAwODAiLCB0aXRsZS5mYWNlID0gInBsYWluIilbWzFdXQoKYGBgCiMjIyBWb2xjYW5vLUxpa2UgUGxvdCAobG9nMkZDIG9mIFRhZyBDb3VudHMgdnMuIEFkanVzdGVkIHAtVmFsdWUpClZvbGNhbm8gcGxvdCBzaG93aW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBsb2cyIGZvbGQgY2hhbmdlIG9mIHRhZyBjb3VudHMKKFdUIHZzLiBLTykgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHAtdmFsdWVzLiBNb3RpZnMgd2l0aCB0b3AgZGlmZmVyZW50aWFsCmZvb3RwcmludGluZyAocC1WYWx1ZSA8PSAwLjA1IGFuZCB8bDJmY3wgPj0gLjEpIGFyZSBoaWdobGlnaHRlZCBpbiByZWQgCihlbnJpY2hlZCBpbiBLTykgb3IgaW4gYmx1ZSAoZW5yaWNoZWRpbiBXVCkuIApgYGB7ciBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD04LCBlY2hvPUYsIHdhcm5pbmc9Rn0KCmV4dC5hY3Rpdml0eS5wbG90IDwtIGFjdGl2aXR5X3Bsb3QgJT4lIGFkZF9jb2x1bW4obG9nMkZDPWxvZzIoLiRUQ19MeW5XVC8uJFRDX0x5bktPKSkKCmZvb3RwcmludGluZ19wbG90KGFjdGl2aXR5X2RmPWV4dC5hY3Rpdml0eS5wbG90LCBhY3Rpdml0eSA9ICJsb2cyRkMiLCBsb2cxMC5zZWNvbmQudmFyaWFibGU9VCwgcHQuY29sb3JzPWMoInJlZCIsICJncmV5IiwgInN0ZWVsYmx1ZSIpLCBzZWNvbmQudmFyaWFibGUgPSAiUF92YWx1ZXMiLCBzZWxlY3RlZC5nZW5lcyA9IGMoIiIpLCB5bGltPWMoLS41LC41KSwgcHQuc2l6ZXMgPSBjKDIsMC41LDIsMiksIHlsYWIgPSAiS08gPC0tIExvZzIgb2YgVGFnIENvdW50cyAtLT4gV1QiLCB4bGFiPSAiLWxvZzEwKGFkanVzdGVkIHAtdmFsdWUpIFtzaWduaWZpY2FuY2VdIiAsc2lnbi5obGluZSA9ICJib3RoIiwgc2lnbi5oY3V0ID0gLjEsIHNpZ24udmN1dCA9IC1sb2cxMCgwLjA1KSwgc2lnbi52bGluZSA9ICJvbmUiLCBjb29yZF9mbGlwID0gVCwgdGl0bGU9IkxvZzIgb2YgVGFnIENvdW50cyB2cy4gQWRqdXN0ZWQgcC1WYWx1ZSIsIHRpdGxlLmNvbG9yID0gIiMwMDAwODAiLCB0aXRsZS5mYWNlID0gInBsYWluIilbWzFdXQoKYGBgCgoKIyMgey50YWJzZXQgLnRhYnNldC1mYWRlfQoKPGg1PkxpbmVQbG90cyAoQVAtMSBzdWJ1bml0cykgIDwvaDU+CgpgYGB7ciBlY2hvPUYsIGZpZy53aWR0aD0xOCwgZmlnLmhlaWdodD0xOH0KbGluZXBsb3RzX2RpciA8LSAicmVzdWx0cy9mb290cHJpbnRpbmcvNF9kaWZmZXJlbnRpYWxfZm9vdHByaW50cy9MeW5LT19MeW5XVC9MaW5lcGxvdHMvIgpsaW5lcGxvdHNfZmlsZSA8LSBsaXN0LmZpbGVzKHBhdGggPSBsaW5lcGxvdHNfZGlyLCBwYXR0ZXJuID0gIip0eHQiLCBmdWxsLm5hbWVzID0gVCkKbGluZXBsb3RzX25hbWVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IGxpbmVwbG90c19kaXIsIHBhdHRlcm4gPSAiKnR4dCIsIGZ1bGwubmFtZXMgPSBGKQpyb2lfbHBfZGF0YV9maWxlX3BhdGggPC0gYXMuZGF0YS5mcmFtZShsaW5lcGxvdHNfZmlsZSkgJT4lIGZpbHRlcihncmVwbCgiTkZLQnxTVEFUMXxKVU58Rk9TfCheQVRGKSIsbGluZXBsb3RzX2ZpbGUpKSAlPiUgYXMubGlzdCgpICU+JSB1bmxpc3QoKQpyb2lfbHBfZGF0YV9uYW1lcyA8LSBhcy5kYXRhLmZyYW1lKGxpbmVwbG90c19uYW1lcykgJT4lIGZpbHRlcihncmVwbCgiTkZLQnxUSEJTMXxTVEFUMXxKVU58Rk9TfCheQVRGKSIsbGluZXBsb3RzX2ZpbGUpKSAlPiUgYXMubGlzdCgpICU+JSB1bmxpc3QoKSAlPiUgZ3N1YihwYXR0ZXJuID0gIlxcLnR4dCIsIHJlcGxhY2VtZW50ID0gIiIpCmxpbmVwbG90cyA8LSB2ZWN0b3IoImxpc3QiLCBsZW5ndGgocm9pX2xwX2RhdGFfZmlsZV9wYXRoKSkKZm9yKHIgaW4gMTpsZW5ndGgocm9pX2xwX2RhdGFfZmlsZV9wYXRoKSl7CiAgZGYgPC0gcmVhZC50YWJsZShyb2lfbHBfZGF0YV9maWxlX3BhdGhbcl0sIGhlYWRlciA9IFQsIHNlcD0iXHQiKQogIGRmJGlkIDwtIC0xMDA6OTkKICBkZiA8LSBkZiAlPiUgdGlkeXI6OmdhdGhlcihrZXk9IkNvbmRpdGlvbiIsIHZhbHVlPSJDb3ZlcmFnZSIsIDE6MikKICBsaW5lcGxvdHNbW3JdXSA8LSBnZ3Bsb3QoZGYsIGFlcyh4PWlkLCB5PUNvdmVyYWdlLCBjb2xvdXI9Q29uZGl0aW9uLCBsaW5ldHlwZT1Db25kaXRpb24pKSArIAogICAgICAgICAgICAgICAgICAgIGdlb21fbGluZSgpICsgdGhlbWVfcHVicigpICsgCiAgICAgICAgICAgICAgICAgICAgeWxhYigiQ292ZXJhZ2UiKSArIHhsYWIoIlBvc2l0aW9uIGFyb3VuZCBmb290cHJpbnQiKSArIAogICAgICAgICAgICAgICAgICAgIGdndGl0bGUocm9pX2xwX2RhdGFfbmFtZXNbcl0pICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUsIGZhY2U9ImJvbGQiKSkgKyAKICAgICAgICAgICAgICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoImdyZXkiLCAicmVkIikpICsgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcz1jKCJzb2xpZCIsICJzb2xpZCIpKQp9CgpsaW5lcyA8LSB2ZWN0b3IoImxpc3QiLCBsZW5ndGgocm9pX2xwX2RhdGFfZmlsZV9wYXRoKSkKZm9yKHIgaW4gMTpsZW5ndGgocm9pX2xwX2RhdGFfZmlsZV9wYXRoKSl7CiAgCiAgdmVyeS5zdHJvbmdseS5zaWduLm1vdGlmcyA8LSBhY3Rpdml0eV9wbG90W2FjdGl2aXR5X3Bsb3QkUF92YWx1ZXM8MC4wMDEsXSRNb3RpZiAlPiUgCiAgICAgICAgICAgIGdzdWIocGF0dGVybiA9ICJcXCgiLCByZXBsYWNlbWVudCA9ICJfIikgICU+JSAKICAgICAgICAgICAgZ3N1YihwYXR0ZXJuID0gIlxcKSIsIHJlcGxhY2VtZW50ID0gIiIpCiAgCiAgc3Ryb25nbHkuc2lnbi5tb3RpZnMgPC0gYWN0aXZpdHlfcGxvdFthY3Rpdml0eV9wbG90JFBfdmFsdWVzPDAuMDEsXSRNb3RpZiAlPiUgCiAgICAgICAgICAgIGdzdWIocGF0dGVybiA9ICJcXCgiLCByZXBsYWNlbWVudCA9ICJfIikgICU+JSAKICAgICAgICAgICAgZ3N1YihwYXR0ZXJuID0gIlxcKSIsIHJlcGxhY2VtZW50ID0gIiIpCiAgc2lnbi5tb3RpZnMgPC0gYWN0aXZpdHlfcGxvdFthY3Rpdml0eV9wbG90JFBfdmFsdWVzPDAuMDUsXSRNb3RpZiAlPiUgCiAgICAgICAgICAgIGdzdWIocGF0dGVybiA9ICJcXCgiLCByZXBsYWNlbWVudCA9ICJfIikgICU+JSAKICAgICAgICAgICAgZ3N1YihwYXR0ZXJuID0gIlxcKSIsIHJlcGxhY2VtZW50ID0gIiIpCiAgd2Vha2x5LnNpZ24ubW90aWZzIDwtIGFjdGl2aXR5X3Bsb3RbYWN0aXZpdHlfcGxvdCRQX3ZhbHVlczwwLjEsXSRNb3RpZiAlPiUgCiAgICAgICAgICAgIGdzdWIocGF0dGVybiA9ICJcXCgiLCByZXBsYWNlbWVudCA9ICJfIikgICU+JSAKICAgICAgICAgICAgZ3N1YihwYXR0ZXJuID0gIlxcKSIsIHJlcGxhY2VtZW50ID0gIiIpCiAgCiAgCiAgYWxsLm1vdGlmcyA8LSBhY3Rpdml0eV9wbG90JE1vdGlmICU+JSAKICAgICAgICAgICAgZ3N1YihwYXR0ZXJuID0gIlxcKCIsIHJlcGxhY2VtZW50ID0gIl8iKSAgJT4lIAogICAgICAgICAgICBnc3ViKHBhdHRlcm4gPSAiXFwpIiwgcmVwbGFjZW1lbnQgPSAiIikKICAKICBhY3Rpdml0eV9wbG90JE1vdGlmLjIgPC0gYWxsLm1vdGlmcwogIAogIHN0YW5kYXJkLnRpdGxlcyA8LSBwYXN0ZShyb2lfbHBfZGF0YV9uYW1lc1tyXSwgIiAoIixyb3VuZChhY3Rpdml0eV9wbG90W2FjdGl2aXR5X3Bsb3QkTW90aWYuMiAlaW4lIGMocm9pX2xwX2RhdGFfbmFtZXNbcl0pLF0kUF92YWx1ZXMsIDIpLCIpIixzZXA9IiIpCiAgCiAgc2lnbi50aXRsZXMgPC0gcGFzdGUoc3RhbmRhcmQudGl0bGVzLCIgKiIsc2VwPSIiKQogIHN0cm9uZ2x5LnNpZ24udGl0bGVzIDwtIHBhc3RlKHN0YW5kYXJkLnRpdGxlcywiICoqIixzZXA9IiIpCiAgdmVyeS5zdHJvbmdseS5zaWduLnRpdGxlcyA8LSBwYXN0ZShzdGFuZGFyZC50aXRsZXMsIiAqKioiLHNlcD0iIikKICB3ZWFrLnNpZ24udGl0bGVzIDwtIHBhc3RlKHN0YW5kYXJkLnRpdGxlcywiICsiLHNlcD0iIikKIAogIGlmKEYpeyAKICB3cml0ZUxpbmVzKCBjKHBhc3RlKCIjIyMgIixpZmVsc2Uocm9pX2xwX2RhdGFfbmFtZXNbcl0gJWluJSB2ZXJ5LnN0cm9uZ2x5LnNpZ24ubW90aWZzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyeS5zdHJvbmdseS5zaWduLnRpdGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHJvaV9scF9kYXRhX25hbWVzW3JdICVpbiUgc3Ryb25nbHkuc2lnbi5tb3RpZnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJvbmdseS5zaWduLnRpdGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHJvaV9scF9kYXRhX25hbWVzW3JdICVpbiUgc2lnbi5tb3RpZnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbi50aXRsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uocm9pX2xwX2RhdGFfbmFtZXNbcl0gJWluJSB3ZWFrbHkuc2lnbi5tb3RpZnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYWsuc2lnbi50aXRsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQudGl0bGVzKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICBzZXA9IiIpLCAKICAgICAgICAgICAgICAgImBgYHtyIGVjaG89Rn0iLCAKICAgICAgICAgICAgICAgcGFzdGUoImxpbmVwbG90c1tbIixyLCJdXSIsc2VwPSIiKSwKICAgICAgICAgICAgICAgImBgYCIsCiAgICAgICAgICAgICAgICIiKQogICkKICB9CiAKfQpgYGAKCiMjIyBNQTAwOTkuMy5GT1M6OkpVTiAoMC44OCkKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzFdXQpgYGAKCiMjIyBNQTAxMDUuNC5ORktCMSAoMC43NSkKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzJdXQpgYGAKCiMjIyBNQTAxMzcuMy5TVEFUMSAoMC41NSkKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzNdXQpgYGAKCiMjIyBNQTA0NjIuMi5CQVRGOjpKVU4gKDAuNjkpCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1s0XV0KYGBgCgojIyMgTUEwNDc2LjEuRk9TICgwLjIzKQpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbNV1dCmBgYAoKIyMjIE1BMDQ3Ny4yLkZPU0wxICgwLjYyKQpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbNl1dCmBgYAoKIyMjIE1BMDQ3OC4xLkZPU0wyICgwLjkxKQpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbN11dCmBgYAoKIyMjIE1BMDQ4OC4xLkpVTiAoMC4wOCkgKwpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbOF1dCmBgYAoKIyMjIE1BMDQ4OS4xLkpVTl92YXIuMiAoMC43MikKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzldXQpgYGAKCiMjIyBNQTA0OTAuMi5KVU5CICgwLjAyKSAqCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1sxMF1dCmBgYAoKIyMjIE1BMDQ5MS4yLkpVTkQgKDAuMDMpICoKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzExXV0KYGBgCgojIyMgTUEwNDkyLjEuSlVORF92YXIuMiAoMC4wNCkgKgpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbMTJdXQpgYGAKCiMjIyBNQTA1MTcuMS5TVEFUMTo6U1RBVDIgKDAuMTEpCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1sxM11dCmBgYAoKIyMjIE1BMDc3OC4xLk5GS0IyICgwLjQyKQpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbMTRdXQpgYGAKCiMjIyBNQTExMjYuMS5GT1M6OkpVTl92YXIuMiAoMC4wNCkgKgpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbMTVdXQpgYGAKCiMjIyBNQTExMjcuMS5GT1NCOjpKVU4gKDAuMDIpICoKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzE2XV0KYGBgCgojIyMgTUExMTI4LjEuRk9TTDE6OkpVTiAoMC4wOSkgKwpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbMTddXQpgYGAKCiMjIyBNQTExMjkuMS5GT1NMMTo6SlVOX3Zhci4yICgwLjAxKSAqKgpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbMThdXQpgYGAKCiMjIyBNQTExMzAuMS5GT1NMMjo6SlVOICgwLjg4KQpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbMTldXQpgYGAKCiMjIyBNQTExMzEuMS5GT1NMMjo6SlVOX3Zhci4yICgwLjA4KSArCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1syMF1dCmBgYAoKIyMjIE1BMTEzMi4xLkpVTjo6SlVOQiAoMC43MykKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzIxXV0KYGBgCgojIyMgTUExMTMzLjEuSlVOOjpKVU5CX3Zhci4yICgwLjA2KSArCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1syMl1dCmBgYAoKIyMjIE1BMTEzNC4xLkZPUzo6SlVOQiAoMC44NCkKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzIzXV0KYGBgCgojIyMgTUExMTM1LjEuRk9TQjo6SlVOQiAoMC42MykKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzI0XV0KYGBgCgojIyMgTUExMTM2LjEuRk9TQjo6SlVOQl92YXIuMiAoMC4wMDYpICoqKgpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbMjVdXQpgYGAKCiMjIyBNQTExMzcuMS5GT1NMMTo6SlVOQiAoMC4yOSkKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzI2XV0KYGBgCgojIyMgTUExMTM4LjEuRk9TTDI6OkpVTkIgKDAuMjkpCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1syN11dCmBgYAoKIyMjIE1BMTEzOS4xLkZPU0wyOjpKVU5CX3Zhci4yICgwLjAxKSAqKgpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbMjhdXQpgYGAKCiMjIyBNQTExNDAuMi5KVU5CX3Zhci4yICgwLjQ5KQpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbMjldXQpgYGAKCiMjIyBNQTExNDEuMS5GT1M6OkpVTkQgKDAuMzgpCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1szMF1dCmBgYAoKIyMjIE1BMTE0Mi4xLkZPU0wxOjpKVU5EICgwLjAxKSAqKgpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbMzFdXQpgYGAKCiMjIyBNQTExNDMuMS5GT1NMMTo6SlVORF92YXIuMiAoMC4wMSkgKioKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzMyXV0KYGBgCgojIyMgTUExMTQ1LjEuRk9TTDI6OkpVTkRfdmFyLjIgKDAuMDIpICoKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzMzXV0KYGBgCiMjIHsudGFic2V0IC50YWJzZXQtZmFkZX0KCjxoNT5MaW5lUGxvdHMgKGRpZmZlcmVudGlhbGx5IGJpbmRpbmcgVEYpICA8L2g1PgoKYGBge3IgZWNobz1GfQoiTUEwNzQ2LjIuU1AzfE1BMDg4OC4xLkVWWDJ8TUEwODYyLjEuR01FQjJ8TUEwNjA0LjEuQXRmMXxNQTAwNjAuMy5ORllBfE1BMDg0NC4xLlhCUDF8TUExNTY0LjEuU1A5fE1BMTQ3NS4xLkNSRUIzTDQodmFyLjIpfE1BMDg0MC4xLkNyZWI1fE1BMTE0Mi4xLkZPU0wxOjpKVU5EfE1BMDgzNC4xLkFURjd8TUEwODM3LjEuQ0VCUEV8TUExMTQzLjEuRk9TTDE6OkpVTkQodmFyLjIpfE1BMDg4Ni4xLkVNWDJ8TUExNjM0LjEuQkFURnxNQTExMjUuMS5aTkYzODR8TUEwNjg1LjEuU1A0fE1BMTY4My4xLkZPWEEzfE1BMTEyNi4xLkZPUzo6SlVOKHZhci4yKXxNQTA4MzUuMi5CQVRGM3xNQTExNDUuMS5GT1NMMjo6SlVORCh2YXIuMil8TUEwNDkwLjIuSlVOQnxNQTA1MTYuMi5TUDJ8TUEwNjM4LjEuQ1JFQjN8TUEwNDkyLjEuSlVORCh2YXIuMil8TUExMTM2LjEuRk9TQjo6SlVOQih2YXIuMil8TUExNTYwLjEuU09ITEgyfE1BMDQ5MS4yLkpVTkR8TUEwODkzLjIuR1NYMnxNQTA1MDIuMi5ORllCfE1BMTQ3MC4xLkJBQ0gyKHZhci4yKXxNQTA5MTIuMi5IT1hEM3xNQTAwNzkuNC5TUDF8TUEwMDUwLjIuSVJGMXxNQTE2MzIuMS5BVEYyfE1BMTEyNy4xLkZPU0I6OkpVTnxNQTA3NDAuMS5LTEYxNHxNQTA0NjQuMi5CSExIRTQwfE1BMDYwOS4yLkNSRU18TUExNTU3LjEuU01BRDV8TUExMTI5LjEuRk9TTDE6OkpVTih2YXIuMil8TUEwNzU1LjEuQ1VYMnxNQTExMzkuMS5GT1NMMjo6SlVOQih2YXIuMikiCgoKYGBgCgoKYGBge3IgZWNobz1GLCBmaWcud2lkdGg9MTgsIGZpZy5oZWlnaHQ9MTh9CmxpbmVwbG90c19kaXIgPC0gIn4vRGVza3RvcC9SUHJvamVjdHMvQVRBQ19SZXByb2dyYW1taW5nX29mX0ZpYnJvYmxhc3RzL3Jlc3VsdHMvZm9vdHByaW50aW5nLzRfZGlmZmVyZW50aWFsX2Zvb3RwcmludHMvTHluS09fTHluV1QvTGluZXBsb3RzLyIKZGlmZl9zdGF0aXN0aWNzIDwtIHJlYWQudGFibGUoIn4vRGVza3RvcC9SUHJvamVjdHMvQVRBQ19SZXByb2dyYW1taW5nX29mX0ZpYnJvYmxhc3RzL3Jlc3VsdHMvZm9vdHByaW50aW5nLzRfZGlmZmVyZW50aWFsX2Zvb3RwcmludHMvTHluS09fTHluV1QvZGlmZmVyZW50aWFsX3N0YXRpc3RpY3MudHh0Iiwgc2VwID0gIlx0IiwgaGVhZGVyID0gVCkKZGlmZl9zdGF0aXN0aWNzIDwtIGRpZmZfc3RhdGlzdGljcyAlPiUgZmlsdGVyKFBfdmFsdWVzIDw9IDAuMDUpCmxpbmVwbG90c19maWxlIDwtIGxpc3QuZmlsZXMocGF0aCA9IGxpbmVwbG90c19kaXIsIHBhdHRlcm4gPSAiKnR4dCIsIGZ1bGwubmFtZXMgPSBUKQpsaW5lcGxvdHNfbmFtZXMgPC0gbGlzdC5maWxlcyhwYXRoID0gbGluZXBsb3RzX2RpciwgcGF0dGVybiA9ICIqdHh0IiwgZnVsbC5uYW1lcyA9IEYpCgoKCnJvaV9scF9kYXRhX2ZpbGVfcGF0aCA8LSBhcy5kYXRhLmZyYW1lKGxpbmVwbG90c19maWxlKSAlPiUgZmlsdGVyKGdyZXBsKHBhc3RlKCIoIixwYXN0ZShkaWZmX3N0YXRpc3RpY3MkTW90aWYsY29sbGFwc2UgPSAiKXwoIiksIikiLHNlcD0iIiksbGluZXBsb3RzX2ZpbGUpKSAlPiUgYXMubGlzdCgpICU+JSB1bmxpc3QoKQpyb2lfbHBfZGF0YV9uYW1lcyA8LSBhcy5kYXRhLmZyYW1lKGxpbmVwbG90c19uYW1lcykgJT4lIGZpbHRlcihncmVwbChwYXN0ZSgiKCIscGFzdGUoZGlmZl9zdGF0aXN0aWNzJE1vdGlmLGNvbGxhcHNlID0gIil8KCIpLCIpIixzZXA9IiIpLGxpbmVwbG90c19maWxlKSkgJT4lIGFzLmxpc3QoKSAlPiUgdW5saXN0KCkgJT4lIGdzdWIocGF0dGVybiA9ICJcXC50eHQiLCByZXBsYWNlbWVudCA9ICIiKQpsaW5lcGxvdHMgPC0gdmVjdG9yKCJsaXN0IiwgbGVuZ3RoKHJvaV9scF9kYXRhX2ZpbGVfcGF0aCkpCmZvcihyIGluIDE6bGVuZ3RoKHJvaV9scF9kYXRhX2ZpbGVfcGF0aCkpewogIGRmIDwtIHJlYWQudGFibGUocm9pX2xwX2RhdGFfZmlsZV9wYXRoW3JdLCBoZWFkZXIgPSBULCBzZXA9Ilx0IikKICBkZiRpZCA8LSAtMTAwOjk5CiAgZGYgPC0gZGYgJT4lIHRpZHlyOjpnYXRoZXIoa2V5PSJDb25kaXRpb24iLCB2YWx1ZT0iQ292ZXJhZ2UiLCAxOjIpCiAgbGluZXBsb3RzW1tyXV0gPC0gZ2dwbG90KGRmLCBhZXMoeD1pZCwgeT1Db3ZlcmFnZSwgY29sb3VyPUNvbmRpdGlvbiwgbGluZXR5cGU9Q29uZGl0aW9uKSkgKyAKICAgICAgICAgICAgICAgICAgICBnZW9tX2xpbmUoKSArIHRoZW1lX3B1YnIoKSArIAogICAgICAgICAgICAgICAgICAgIHlsYWIoIkNvdmVyYWdlIikgKyB4bGFiKCJQb3NpdGlvbiBhcm91bmQgZm9vdHByaW50IikgKyAKICAgICAgICAgICAgICAgICAgICBnZ3RpdGxlKHJvaV9scF9kYXRhX25hbWVzW3JdKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41LCBmYWNlPSJib2xkIikpICsgCiAgICAgICAgICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJncmV5IiwgInJlZCIpKSArIHNjYWxlX2xpbmV0eXBlX21hbnVhbCh2YWx1ZXM9Yygic29saWQiLCAic29saWQiKSkKfQoKbGluZXMgPC0gdmVjdG9yKCJsaXN0IiwgbGVuZ3RoKHJvaV9scF9kYXRhX2ZpbGVfcGF0aCkpCmZvcihyIGluIDE6bGVuZ3RoKHJvaV9scF9kYXRhX2ZpbGVfcGF0aCkpewogIAogIHZlcnkuc3Ryb25nbHkuc2lnbi5tb3RpZnMgPC0gIGFjdGl2aXR5X3Bsb3RbYWN0aXZpdHlfcGxvdCRQX3ZhbHVlczwwLjAwMSxdJE1vdGlmICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3ViKHBhdHRlcm4gPSAiXFwoIiwgcmVwbGFjZW1lbnQgPSAiXyIpICAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N1YihwYXR0ZXJuID0gIlxcKSIsIHJlcGxhY2VtZW50ID0gIiIpCiAgCiAgICAgICBzdHJvbmdseS5zaWduLm1vdGlmcyA8LSAgYWN0aXZpdHlfcGxvdFthY3Rpdml0eV9wbG90JFBfdmFsdWVzPDAuMDEsXSRNb3RpZiAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N1YihwYXR0ZXJuID0gIlxcKCIsIHJlcGxhY2VtZW50ID0gIl8iKSAgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdWIocGF0dGVybiA9ICJcXCkiLCByZXBsYWNlbWVudCA9ICIiKQogIAogICAgICAgICAgICAgICAgc2lnbi5tb3RpZnMgPC0gIGFjdGl2aXR5X3Bsb3RbYWN0aXZpdHlfcGxvdCRQX3ZhbHVlczwwLjA1LF0kTW90aWYgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdWIocGF0dGVybiA9ICJcXCgiLCByZXBsYWNlbWVudCA9ICJfIikgICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3ViKHBhdHRlcm4gPSAiXFwpIiwgcmVwbGFjZW1lbnQgPSAiIikKICAKICAgICAgICAgd2Vha2x5LnNpZ24ubW90aWZzIDwtICBhY3Rpdml0eV9wbG90W2FjdGl2aXR5X3Bsb3QkUF92YWx1ZXM8MC4xLF0kTW90aWYgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdWIocGF0dGVybiA9ICJcXCgiLCByZXBsYWNlbWVudCA9ICJfIikgICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3ViKHBhdHRlcm4gPSAiXFwpIiwgcmVwbGFjZW1lbnQgPSAiIikKICAKICAgICAgICAgICAgICAgICBhbGwubW90aWZzIDwtICBhY3Rpdml0eV9wbG90JE1vdGlmICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3ViKHBhdHRlcm4gPSAiXFwoIiwgcmVwbGFjZW1lbnQgPSAiXyIpICAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N1YihwYXR0ZXJuID0gIlxcKSIsIHJlcGxhY2VtZW50ID0gIiIpCiAgCiAgYWN0aXZpdHlfcGxvdCRNb3RpZi4yIDwtIGFsbC5tb3RpZnMKICBzdGFuZGFyZC50aXRsZXMgPC0gcGFzdGUocm9pX2xwX2RhdGFfbmFtZXNbcl0sIiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiKCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKGFjdGl2aXR5X3Bsb3RbYWN0aXZpdHlfcGxvdCRNb3RpZi4yICVpbiUgYyhyb2lfbHBfZGF0YV9uYW1lc1tyXSksXSRQX3ZhbHVlcywgMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwPSIiKQogIHNpZ24udGl0bGVzIDwtIHBhc3RlKHN0YW5kYXJkLnRpdGxlcywiICoiLHNlcD0iIikKICBzdHJvbmdseS5zaWduLnRpdGxlcyA8LSBwYXN0ZShzdGFuZGFyZC50aXRsZXMsIiAqKiIsc2VwPSIiKQogIHZlcnkuc3Ryb25nbHkuc2lnbi50aXRsZXMgPC0gcGFzdGUoc3RhbmRhcmQudGl0bGVzLCIgKioqIixzZXA9IiIpCiAgd2Vhay5zaWduLnRpdGxlcyA8LSBwYXN0ZShzdGFuZGFyZC50aXRsZXMsIiArIixzZXA9IiIpCiAgCiAgd3JpdGVMaW5lcyggYyhwYXN0ZSgiIyMjICIsaWZlbHNlKHJvaV9scF9kYXRhX25hbWVzW3JdICVpbiUgdmVyeS5zdHJvbmdseS5zaWduLm1vdGlmcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnkuc3Ryb25nbHkuc2lnbi50aXRsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShyb2lfbHBfZGF0YV9uYW1lc1tyXSAlaW4lIHN0cm9uZ2x5LnNpZ24ubW90aWZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb25nbHkuc2lnbi50aXRsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uocm9pX2xwX2RhdGFfbmFtZXNbcl0gJWluJSBzaWduLm1vdGlmcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduLnRpdGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uocm9pX2xwX2RhdGFfbmFtZXNbcl0gJWluJSB3ZWFrbHkuc2lnbi5tb3RpZnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYWsuc2lnbi50aXRsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkLnRpdGxlcykpKSksc2VwPSIiKSwgCiAgICAgICAgICAgICAgICAgICAgICJgYGB7ciBlY2hvPUZ9IiwgCiAgICAgICAgICAgICAgICAgICAgIHBhc3RlKCJsaW5lcGxvdHNbWyIsciwiXV0iLHNlcD0iIiksCiAgICAgICAgICAgICAgICAgICAgICJgYGAiLAogICAgICAgICAgICAgICAgICAgICAiIikpCn0KYGBgCgoKIyMjIE1BMDA1MC4yLklSRjEgKDApICoqKgpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbMV1dCmBgYAoKIyMjIE1BMDA2MC4zLk5GWUEgKDApICoqCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1syXV0KYGBgCgojIyMgTUEwMDc5LjQuU1AxICgwLjAxKSAqCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1szXV0KYGBgCgojIyMgTUEwNDY0LjIuQkhMSEU0MCAoMC4wMikgKgpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbNF1dCmBgYAoKIyMjIE1BMDQ5MC4yLkpVTkIgKDAuMDIpICoKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzVdXQpgYGAKCiMjIyBNQTA0OTEuMi5KVU5EICgwLjAzKSAqCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1s2XV0KYGBgCgojIyMgTUEwNTAyLjIuTkZZQiAoMCkgKioqCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1s3XV0KYGBgCgojIyMgTUEwNTE2LjIuU1AyICgwLjAxKSAqCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1s4XV0KYGBgCgojIyMgTUEwNjA0LjEuQXRmMSAoMC4wMikgKgpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbOV1dCmBgYAoKIyMjIE1BMDYwOS4yLkNSRU0gKDAuMDQpICoKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzEwXV0KYGBgCgojIyMgTUEwNjM4LjEuQ1JFQjMgKDAuMDMpICoKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzExXV0KYGBgCgojIyMgTUEwNjg1LjEuU1A0ICgwKSAqKgpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbMTJdXQpgYGAKCiMjIyBNQTA3NDAuMS5LTEYxNCAoMCkgKioKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzEzXV0KYGBgCgojIyMgTUEwNzQ2LjIuU1AzICgwLjAyKSAqCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1sxNF1dCmBgYAoKIyMjIE1BMDc1NS4xLkNVWDIgKDAuMDEpICoqCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1sxNV1dCmBgYAoKIyMjIE1BMDgzNC4xLkFURjcgKDAuMDQpICoKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzE2XV0KYGBgCgojIyMgTUEwODM1LjIuQkFURjMgKDAuMDIpICoKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzE3XV0KYGBgCgojIyMgTUEwODM3LjEuQ0VCUEUgKDAuMDIpICoKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzE4XV0KYGBgCgojIyMgTUEwODQwLjEuQ3JlYjUgKDAuMDQpICoKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzE5XV0KYGBgCgojIyMgTUEwODQ0LjEuWEJQMSAoMC4wMSkgKioKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzIwXV0KYGBgCgojIyMgTUEwODYyLjEuR01FQjIgKDAuMDEpICoqCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1syMV1dCmBgYAoKIyMjIE1BMDg4Ni4xLkVNWDIgKDAuMDMpICoKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzIyXV0KYGBgCgojIyMgTUEwODg4LjEuRVZYMiAoMCkgKioqCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1syM11dCmBgYAoKIyMjIE1BMDg5My4yLkdTWDIgKDApICoqCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1syNF1dCmBgYAoKIyMjIE1BMDkxMi4yLkhPWEQzICgwLjAzKSAqCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1syNV1dCmBgYAoKIyMjIE1BMTEyNS4xLlpORjM4NCAoMCkgKioKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzI2XV0KYGBgCgojIyMgTUExMTI3LjEuRk9TQjo6SlVOICgwLjAyKSAqCmBgYHtyIGVjaG89Rn0KbGluZXBsb3RzW1syN11dCmBgYAoKIyMjIE1BMTE0Mi4xLkZPU0wxOjpKVU5EICgwLjAxKSAqKgpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbMjhdXQpgYGAKCiMjIyBNQTE1NTcuMS5TTUFENSAoMC4wNCkgKgpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbMjldXQpgYGAKCiMjIyBNQTE1NjAuMS5TT0hMSDIgKDApICoqKgpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbMzBdXQpgYGAKCiMjIyBNQTE1NjQuMS5TUDkgKDAuMDQpICoKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzMxXV0KYGBgCgojIyMgTUExNjMyLjEuQVRGMiAoMC4wMykgKgpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbMzJdXQpgYGAKCiMjIyBNQTE2MzQuMS5CQVRGICgwKSAqKioKYGBge3IgZWNobz1GfQpsaW5lcGxvdHNbWzMzXV0KYGBgCgojIyMgTUExNjgzLjEuRk9YQTMgKDApICoqKgpgYGB7ciBlY2hvPUZ9CmxpbmVwbG90c1tbMzRdXQpgYGAKCiMjIyBBdXRob3IgYW5kIHNlc3Npb24gSW5mb3JtYXRpb24KPGg0PkFuYWx5emVkIGJ5PC9oND4KRHIuIEFsaSBULiBBYmRhbGxhaCwgRGlwbC4gSW5mLjwvYnI+CkJpb2luZm9ybWF0aWNzIEZhY2lsaXR5IChDb29yZGluYXRvcik8L2JyPgpVbml2ZXJzaXR5IEhvc3BpdGFsIG9mIENvbG9nbmUgLSBDRUNBRCBSZXNlYXJjaCBDZW50ZXI8L2JyPgpKb3NlcGgtU3RlbHptYW5uLVN0ci4gMjYsIDUyMDc0IENvbG9nbmUsIEdlcm1hbnk8L2JyPgpQaG9uZSArNDkgMjIxIDQ3OCA4NDAxNzwvYnI+Cgo8aDQ+RGV0YWlsZWQgU2Vzc2lvbiBJbmZvPC9oND4KYGBge3IgZWNobz1GQUxTRX0Kc2Vzc2lvbkluZm8oKQpgYGA=